rabbitmq-保证发送消息可靠性-方案
**发送消息(发送端-交换机-队列)** 总结:只有当消息确认ack为true且未执行失败回调方法时,才保证发送端消息已经成功发送!
执行失败回调方法时,说明消息已经发送到(broker)交换机,交换机路由到队列出现了问题。此时需要我们自己来解决 发送端信息成功到交换机确认机制: 前提:开启消息确认 connectionFactory.setPublisherConfirms(true); 如果成功,会给发送端一个为true的ack,表示发送成功! 如果失败,会给发送端一个为false的ack,表示发送失败! 代码如下: /** * 发送端是否发送到交换机 */ public class RabbitmqConfirm implements RabbitTemplate.ConfirmCallback { /** * 发送端回调方法 * @param correlationData 发送到mq时传入的业务参数(例如:业务id) * @param ack 结果标志 * true: 发送端 ——> 交换机 成功 * false:发送端 ——> 交换机 失败 * @param message 结果消息:ack为true时,返回为null * ack为false时,返回失败消息 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String message) { System.out.println(correlationData.getId()); System.out.println(ack); System.out.println(message); } } 交换机信息成功路由到队列确认机制: 前提:开启消息确认 connectionFactory.setPublisherConfirms(true); 开启失败回调 rabbitTemplate.setMandatory(true); 如果成功,则不会调用失败回调方法! 如果失败,则会调用失败回调方法! 代码如下: /** * 交换机是否发送到队列 */ public class RabbitmqReturnConfirm implements RabbitTemplate.ReturnCallback { /** * 交换机发送队列失败回调: * * 采用一个不存在的routingKey可做测试 * @param message 发送的消息+消息配置信息 * @param replyCode 状态码 * @param replyText 状态内容 * @param exchange 交换机 * @param routingKey 路由键 */ @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { System.out.println(message); System.out.println(replyCode); System.out.println(replyText); System.out.println(exchange); System.out.println(routingKey); } }
依赖pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>