http://t.csdn.cn/3xMJk 使用rabbitmq发送邮件。
接着上文使用rabbitmq发送邮件,本篇文章就讲讲,当发送消息失败,我们该怎么确认是那个环节出错了,是在发送邮件时没有到达交换机、还是没有到达队列呢?
rabbitmq提供了回调接口,当发送消息失败的时候,无法准确到达交换机,或者无法被正确路由到目标队列时触发回调方法。
首先需要创建一个类去实现两个接口 ConfirmCallback、ReturnCallback
1、对于confirm方法是用来判断消息是否到达交换机,参数ack是布尔值。true到达交换机。false没有到达交换机。
2、对于returnedMessage方法使用来判断是否到达队列,只要回调这个方法,那就是没有到达队列。没有回调有两种情况:一种消息都没有到达交换机,一种消息到达交换机,没有到达队列
/** * @author weixinxin 2023-07-13 **/ @Slf4j @Component public class RabbitMQAckConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback { @Autowired private RabbitTemplate rabbitTemplate; @PostConstruct public void init(){ rabbitTemplate.setConfirmCallback(this); rabbitTemplate.setReturnCallback(this); } //判断是否到达交换机 @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { if (ack){ log.info("消息到了交换机"); System.out.println("消息到了交换机 -------------"); }else { log.info("消息没有到达交换机"); System.out.println("消息没有到交换机----------------- "); } } //判断是否到达队列 @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { System.out.println("message消息 = " + new String(message.getBody())); System.out.println("replyCode应答码 = " + replyCode); System.out.println("replyText描述 = " + replyText); System.out.println("exchange交换机 = " + exchange); System.out.println("routingKey路由key = " + routingKey); } }
光有上面代码还不行,你还需要开启rabbitmq发布确认机制,和返回机制
因为rabbitmq这两个机制默认一个none:不启用,一个false:不启用消息返回
其实在我上篇rabbitmq发送邮件的application-dev.properties中已经配置过了
spring.rabbitmq.publisher-confirm-type=correlated spring.rabbitmq.publisher-returns=true完整的配置:
#RabbitMQ spring.rabbitmq.port=5672 spring.rabbitmq.host=localhost spring.rabbitmq.username=admin spring.rabbitmq.password=admin spring.rabbitmq.publisher-confirm-type=correlated spring.rabbitmq.publisher-returns=true spring.rabbitmq.virtual-host=TestHost这里还有一个配置讲一下:
spring.rabbitmq.virtual-host=TestHost这是配置 RabbitMQ 的虚拟主机 (Virtual Host) 的属性。可以为 RabbitMQ 连接配置指定要使用的虚拟主机。如果不设置该属性,默认使用的是 RabbitMQ 服务器上的默认虚拟主机 "/”。
他的作用:
实现对不同应用程序或环境的隔离,从而更好地管理和控制消息队列的使用。每个虚拟主机都拥有自己的独立资源,如队列、交换机和绑定等,可以在不同的虚拟主机中创建相互独立的消息队列和交换机。
/** * @author weixinxin 2023-07-14 **/ public class RabbitMqConst { public static final String EXCHANGE_TEST = "exchange.test"; public static final String ROUTING_TEST = "routing.test"; public static final String QUEUE_TEST = "queue.test"; }测试一下:
/** * @author weixinxin 2023-07-14 **/ @RestController @RequestMapping("/rabbitMq") public class RabbitMqController { @Autowired private RabbitMqService rabbitMqService; @GetMapping("/sent") public String sendConfirm(){ //交换机+1,肯定到达不了 rabbitMqService.sentMassage(RabbitMqConst.EXCHANGE_TEST+"1",RabbitMqConst.ROUTING_TEST,"大胆小儿,还不速速退下"); return "消息发送成功"; } }发送消息:
/** * @author weixinxin 2023-07-14 **/ @Service public class RabbitMqService { @Autowired private RabbitTemplate rabbitTemplate; public Boolean sentMassage(String exchange, String routingKey, String massage){ rabbitTemplate.convertAndSend(exchange,routingKey,massage); return true; } }监听器:
/** * @author weixinxin 2023-07-14 **/ @Component public class ConfirmReceiver { @SneakyThrows @RabbitListener(bindings = @QueueBinding( value = @Queue(value = RabbitMqConst.QUEUE_TEST, durable = "true", autoDelete = "false"), exchange = @Exchange(value = RabbitMqConst.EXCHANGE_TEST), key = (RabbitMqConst.ROUTING_TEST) )) public void confirmTest(String msg, Message message, Channel channel) { System.out.println("msg = " + msg); System.out.println("message = " + new String(message.getBody())); //手动确认 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); }
下面测试消息没有到达队列:
/** * @author weixinxin 2023-07-14 **/ @RestController @RequestMapping("/rabbitMq") public class RabbitMqController { @Autowired private RabbitMqService rabbitMqService; @GetMapping("/sent") public String sendConfirm(){ //routingkey+1 rabbitMqService.sentMassage(RabbitMqConst.EXCHANGE_TEST,RabbitMqConst.ROUTING_TEST+"1","大胆小儿,还不速速退下"); return "消息发送成功"; } }
很明显routingkey不对
如果 交换机 和 路由key 都不对,也只会回调到是否到达交换机:
@GetMapping("/sent") public String sendConfirm(){ rabbitMqService.sentMassage(RabbitMqConst.EXCHANGE_TEST+"1",RabbitMqConst.ROUTING_TEST+"1","大胆小儿,还不速速退下"); return "消息发送成功"; }
猜你喜欢
- 6天前(2020海丝之路文化博览会)2023海丝之路文化和旅游博览会开幕
- 6天前(香港航空三亚航线复航了吗)香港航空三亚航线复航
- 6天前(三亚太阳湾柏悦度假酒店)三亚太阳湾柏悦酒店携手ROSEONLY诺誓缔造浪漫七夕
- 6天前(甘州区文化旅游局)2025甘津文旅资源对接推介会在兰州举办
- 6天前(罗马尼亚的匈牙利族自治)江苏赴匈牙利、罗马尼亚开展文旅交流推广活动
- 6天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 6天前(曼谷丽思卡尔顿公寓价格)在曼谷丽思卡尔顿酒店CALEŌ 邂逅鸡尾酒的浪漫艺术
- 6天前(武隆旅游门票)炸了!519中国旅游日武隆甩出王炸福利,59.9元通玩6大景点?!
- 6天前(新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇)新西兰旅游局×时差岛:黄觉的“长白云之乡”奇遇
- 6天前(海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章