/** * Created On : 2/11/2022. * <p> * Author : huayu * <p> * Description: RabbitMQ 消息确认机制: 发送确认 */@Slf4j@Configurationpublic class RabbitMQSendMsgAck {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){//发送确认,消息是通过rabbitTemplate发的,所以要重置rabbitTemplate才可以实现RabbitTemplate rabbitTemplate = new RabbitTemplate();rabbitTemplate.setConnectionFactory(connectionFactory);//开启触发回调处理方法,不论消息推送结果是什么,都会强制触发回调方法rabbitTemplate.setMandatory(true);//指定消息发送到RabbitMQ的broker节点,是否正确到达交换机确然//是否有交换机都会触发rabbitTemplate.setConfirmCallback( (correlationData, ack, cause) ->{log.info("######发送消息确认回调,数据:{}######",correlationData);log.info("######发送消息确认回调,标识:{}######",ack);log.info("######发送消息确认回调,原因:{}######\n",cause);//TODO 如果没有到交换机,ack返回的是false,可能是交换机被删除,就需要进行特殊处理的业务,比如给负责人发送信息或邮件});//消息是否正确到达交换机上绑定的 目标队列//交换机存在且队列不存在才会触发rabbitTemplate.setReturnCallback( ( message, replyCode, replyText,exchange,routingKey) ->{log.info("######发送消息返回回调,数据:{}######",message);log.info("######发送消息返回回调,返回码:{}######",replyCode);log.info("######发送消息返回回调,返回说明:{}######",replyText);log.info("######发送消息返回回调,交换机:{}######",exchange);log.info("######发送消息返回回调,路由键:{}######\n",routingKey);//TODO 如果没有到目标队列,就需要进行特殊处理的业务,比如给负责人发送信息或邮件});return rabbitTemplate;}}3.4.3 交换机/** * Created On : 2/11/2022. * <p> * Author : huayu * <p> * Description: Ack 测试交换机,没有绑定队列 */@Configurationpublic class RabbitMQAckConfig {//ack 测试交换机,没有绑定队列@Beanpublic DirectExchange directExchange(){return new DirectExchange(RabbitMQConstant.RABBITMQ_ACK_EXCHANGE_KH96);}}3.4.4 请求方法/*** @author : huayu* @date: 2/11/2022* @param: [topicMsg]* @return : com.kgc.scd.uitl.RequestResult<java.lang.String>* @description : 直连模式测试 Ack不存在交换机和 存在交换机*/@GetMapping("/sendMsgAck")public RequestResult<String> RabbitMQSendMsgAck(@RequestParam String ackMsg){log.info("------- 直连 模式 测试Ack,发送消息 -------");//模拟发送直连消息//调用直连模式消息生产者,发送消息//测试1: 不存在的 交换机rabbitMQDirectProducer.sendDirectMsg2DirectExchange("test_noExchange",RabbitMQConstant.RABBITMQ_DIRECT_ROUTING_KEY_KH96,JSON.toJSONString(ackMsg));return ResultBuildUtil.success("使用直连模式 测试Ack 。交换机不存在");//测试2: 存在的交换机,但是没有绑定 队列//rabbitMQDirectProducer.sendDirectMsg2DirectExchange(RabbitMQConstant.RABBITMQ_ACK_EXCHANGE_KH96//,RabbitMQConstant.RABBITMQ_DIRECT_ROUTING_KEY_KH96//,JSON.toJSONString(ackMsg));//return ResultBuildUtil.success("使用直连模式 测试Ack 。交换机 没有绑定队列");}3.2.5 请求测试3.2.5.1交换机不存在发起请求:

文章插图
请求结果:交换机不存在,
触发了ConfirmCallback 函数式接口中的唯一抽象方法 confirm,
返回标识 false,发送到交换机失败,
原因,该交换机不存在;

文章插图
注意:如果没有到交换机,ack返回的是false,可能是交换机被删除,就需要进行特殊处理的业务,比如给负责人发送信息或邮件;
3.2.5.2 交换机存在,但是没有绑定 队列发起请求:
经验总结扩展阅读
- 六盘水有什么特色美食 贵州六盘水最有名的七大美食
- 浙江丽水最有名的六大名菜
- 河南菜有哪些特色菜 河南最有名的六大特色名菜
- 北京菜有哪些特色菜 北京最有名的六大特色名菜
- 陕西菜有哪些特色菜 陕西最有名的六大特色名菜
- 2023年1月27日入宅好不好 2023年农历正月初六入宅吉日
- 2023年农历正月初六珠宝开光吉日 2023年1月27日珠宝开光黄道吉日
- 2023年1月27日祭祀吉日一览表 2023年农历正月初六祭祀吉日
- 2023年1月27日拜神行吗 2023年农历正月初六宜拜神吗
- 2023年1月27日请佛好吗 2023年农历正月初六请佛吉日
