网站建设教程论坛,wordpress小工具不见了,宁波定制网站建设,绵阳网站搜索优化在使用RabbitMQ的时候#xff0c;可以通过消息持久化来解决因为服务器的异常而导致的消息就是#xff0c;但是还有一个问题#xff0c;当消息的生产者将消息发送出去之后#xff0c;消息到底有没有正确地到达服务器呢#xff1f;如果消息在到达服务器之前已经丢失#xf…在使用RabbitMQ的时候可以通过消息持久化来解决因为服务器的异常而导致的消息就是但是还有一个问题当消息的生产者将消息发送出去之后消息到底有没有正确地到达服务器呢如果消息在到达服务器之前已经丢失持久化操作也解决不了这个问题那么该如何解决呢
RabbitMQ为我们提供了两种解决方案
1.通过事务机制实现
2.通过发送方确认机制实现
因为事务机制比较消耗性能在实际工作中使用也不多在这里主要介绍confirm机制来实现发送方的确认.RabbitMQ为我们提供了两个方式来控制消息的可靠性投递
1.confirm确认模式
生产者在发送消息的时候对发送端设置了一个ConfirmCallback的监听无论消息是否到达Exchange这个监听都会被执行如果Exchange成功收到ACK确认字符为true如果没有收到消息 ACK就为false.
在这里要讲一下ConfirmCallback和ConfirmListener区别
两者都是用来处理消息确认的机制但他们属于不同的客户端库并且使用场景和方式有所不同.
1.ConfirmListener时RabbitMQ java Client库中的接口这个库时RabbitMQ官方提供的一个直接与RabbitMQ服务器交互的客户端库它提供了两个方法handleAck和handleNack用于处理消息确认和否定的事件.
2.ConfirmCallback是Spring AMQP框架中的一个接口专门为Spring环境设计用于简化与RabbitMQ交互的过程它只包含一个confirm方法用于处理消息确认的回调
在Spring Boot应用中通常会使用ConfirmCallback因为它与Spring框架的其他部分更加整合可以利用Spring的配置和依赖注入功能而在使用RabbitMQ java Client库时则可能会直接实现ConfirmListener接口更直接的与RabbitMQ的Channel交互.
2.return退回模式
消息到达Exchange之后会根据路由规则匹配把消息放入Queue中Exchange到Queue的过程如果一条消息无法被任何队列消费可以选择把消息退回给发送者.消息退回给发送者时我们可以设置一个返回回调方法对消息进行处理. 使⽤RabbitTemplate的setMandatory⽅法设置消息的mandatory属性为true(默认为false). 这个属性 的作⽤是告诉RabbitMQ, 如果⼀条消息⽆法被任何队列消费, RabbitMQ应该将消息返回给发送者, 此时 ReturnCallback 就会被触发