六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)( 七 )

/** * 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交换机不存在发起请求:

六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:交换机不存在,
触发了ConfirmCallback 函数式接口中的唯一抽象方法 confirm,
返回标识 false,发送到交换机失败,
原因,该交换机不存在;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
注意:如果没有到交换机,ack返回的是false,可能是交换机被删除,就需要进行特殊处理的业务,比如给负责人发送信息或邮件;
3.2.5.2 交换机存在,但是没有绑定 队列发起请求:

经验总结扩展阅读