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天前(三亚海棠湾君悦度假酒店)三亚海棠湾君悦酒店暑期夏令营悦趣海岛游招募中
- 6天前(郭富城热舞劲歌演唱会)郭富城年度压轴《新濠尊属系列郭富城梦幻舞林演唱会2023》
- 6天前(临沂 凯悦)临沂第一家凯悦嘉轩酒店开幕迎宾
- 6天前(福朋喜来登酒店宴会厅)福朋喜来登品牌亮相北部湾城市群 阳江中心福朋喜来登酒店开业
- 6天前(花王伴你乐享五一好“趣”处)花王伴你乐享五一好“趣”处
- 6天前(新西兰“空降”上海:新西兰旅游局邀请你来“玩真的”!)新西兰“空降”上海:新西兰旅游局邀请你来“玩真的”!
- 6天前(中国最好的避暑山庄)2025中国十大避暑山庄评选揭晓,澳涞山庄夺魁
- 6天前(苏梅岛普吉岛哪个好玩)苏梅岛金普顿基塔蕾度假酒店推出家庭度假套餐
- 6天前(2025年安徽省“百场黄梅唱响百家景区”示范展示启动)2025年安徽省“百场黄梅唱响百家景区”示范展示启动
- 6天前(锦江 iu)锦江荟APP原生鸿蒙版正式上线打造全场景旅行服务新体验
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章