RabbitMQ作为一款高性能、可靠的消息队列系统,在实际应用中有着广泛的使用。本文将深入探讨RabbitMQ中的死信队列与延迟队列,从概念到实践,带您领略这两个高级特性的魅力。
死信队列是指那些由于某种原因未能被正确处理的消息所进入的队列。在实际应用中,我们可以通过死信队列来处理一些异常情况下的消息,保证消息的可靠性与完整性。
构建交换机和队列
@Bean
public Queue queueA(){
Map<String, Object> config = new HashMap<>();
config.put("x-message-ttl", 10000);//message在该队列queue的存活时间最大为10秒
config.put("x-dead-letter-exchange", "ExchangeB"); //x-dead-letter-exchange参数是设置该队列的死信交换器(DLX)
config.put("x-dead-letter-routing-key", "B");//x-dead-letter-routing-key参数是给这个DLX指定路由键
return new Queue("queueA",true,false,false,config);
}
@Bean
public DirectExchange ExchangeA(){
return new DirectExchange("ExchangeA");
}
@Bean
public Binding bingdingA(){
return BindingBuilder.bind(queueA()).to(ExchangeA()).with("A");
}
构建死信交换机和队列
@Bean
public Queue queueB(){
return new Queue("queueB");
}
@Bean
public DirectExchange ExchangeB(){
return new DirectExchange("ExchangeB");
}
@Bean
public Binding bingdingB(){
return BindingBuilder.bind(queueB()).to(ExchangeB()).with("B");
}
生成者方法
@RequestMapping("/send6")
public String send6(){
//向消息队列发送消息
amqpTemplate.convertAndSend("ExchangeA","A","1856621007");
return "哈哈;";
}
消费者监听
package com.example.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queueB")
public class ReceiverQB {
@RabbitHandler
public void process(String msg) {
log.warn("QB接收到:" + msg);
}
}
消费者yml中添加
手动确认
listener:
simple:
acknowledge-mode: manual
@RabbitHandler
public void process(String id, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
channel.basicAck(tag,true);
log.warn("QA接收到:" + id);
}
}
消息拒绝
basicReject为true就会一直访问,等到访问成功为止,访问超时变为死信就不在访问
package com.example.consumer;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queueA")
public class ReceiverQA {
@RabbitHandler
public void process(String id, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
channel.basicReject(tag,false);
log.warn("QA接收到:" + id);
}
}
了解了RabbitMQ中的死信队列与延迟队列,从概念到实践,从原理到应用,合理地使用死信队列与延迟队列,能够帮助我们更好地构建可靠、高效的消息系统。