SpringBoot中RabbitMQ的消息确认和Return机制
1.再application.yml文件中开启消息确认机制和return机制
spring:rabbitmq:publisher-confirm-type: simplepublisher-returns: true
2.创建confirm和return监听
// MsgConfirmAndReturn.java 中的代码片段@Component
public class MsgConfirmAndReturn implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {private static final Logger logger = LoggerFactory.getLogger(MsgConfirmAndReturn.class);@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init() {rabbitTemplate.setConfirmCallback(this);rabbitTemplate.setReturnCallback(this);}@Overridepublic void confirm(CorrelationData correlationData, boolean b, String s) {// 此方法用于监听消息确认结果(消息是否发送到交换机)if (b) {logger.info("-------消息成功发送到交换机");} else {logger.warn("-------消息发送到交换机失败");}}@Overridepublic void returnedMessage(Message message, int i, String s, String s1, String s2) {// 此方法用于return监听(当交换机分发消息到队列失败时执行)logger.warn("~~~~~~~交换机分发消息到队列失败");}
}
死信队列实现消息延迟
延迟队列:
什么是延时队列?
延迟队列--消息进入到队列之后,延迟指定的时间才能被消费者消费
AMQP协议和RabbitMQ队列本身是不支持延迟队列功能的,但是可以通过TTL(TimeTo Live)特件模拟延迟队列的功能
TTL就是消息的存活时间,RabbitMQ可以分别对队列和消息设置存活时间。在创建队列的时候可以设置队列的存活时间,当消息进入到队列并且在存活时间内没有消费者消费,则此消息就会从当前队列被移除。延迟交换机主要帮我们解决什么问题
1)当我们的业务比较复杂的时候, 需要针对不同的业务消息类型设置不同的过期时间策略, name必然我们也需要为不同的队列消息的过期时间创建很多的Queue的Bean对象, 当业务复杂到一定程度时, 这种方式维护成本过高;
(2)就是队列的先进先出原则导致的问题,当先进入队列的消息的过期时间比后进入消息中的过期时间长的时候,消息是串行被消费的,所以必然是等到先进入队列的消息的过期时间结束, 后进入队列的消息的过期时间才会被监听,然而实际上这个消息早就过期了,这就导致了本来过期时间为3秒的消息,实际上过了13秒才会被处理,这在实际应用场景中肯定是不被允许的
1.因为队列中有一个机制就是过期之后可以将消息进行转发
2.如果没有消费者的队列叫做死信队列;
3.当我们发送到队列1后,没有消费者消费一定会在30分钟后过期:然后过期转发到队列2,此时就实现了之前所说的三十分钟消费的效果