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

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 交换机存在,但是没有绑定 队列发起请求:
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:交换机存在 , 
触发了ConfirmCallback 函数式接口中的唯一抽象方法 confirm ,
返回标识 true,发送到交换机成功;
没有绑定队列,
触发了ReturnCallback 函数式接口中的唯一抽象方法 returnedMessage,
返回说明 NO_ROUT,发送到队列失败;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
注意:如果没有到目标队列 , 就需要进行特殊处理的业务,比如给负责人发送信息或邮件;
3.2.5.3 交换机存在,且绑定了队列发起请求
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:交换机存在 , 且绑定了队列,
触发了ConfirmCallback 函数式接口中的唯一抽象方法 confirm ,
返回标识 true,发送到交换机成功;
没有触发ReturnCallback 函数式接口中的唯一抽象方法 returnedMessage,
说明发送到队列成功;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
3.5 消息确认3.5.1 自动确认3.5.1.1 配置信息# RabbitMQ配置spring:rabbitmq:# 消费消息确认配置-自动listener:simple:retry:enabled: true # 开启消费消息失败重试机制max-attempts: 5 # 指定重试的次数max-interval: 10000 # 最大重试间隔时间,单位毫秒,每次重试的间隔时间,不能比当前设置的值大,如果计算间隔时间是6s,最大时间时间5s,会用5秒initial-interval: 1000 # 重试间隔初始时间,单位毫秒multiplier: 2 #乘子;重试的间隔时间 * 乘子,就是下一次重试的时间间隔市场,即:1s,2s,4s,8s,16...3.5.1.2 消费者 模拟异常注意:测试时为了让消费者One一定接收到消息,所以注释掉消费者Two,这样才可以保证消费者One接收消息,然后触发异常,重试的效果;
/** * Created On : 1/11/2022. * <p> * Author : huayu * <p> * Description: Direct 直连模式消费者 One */@Slf4j@Component//指定接听的 消息队列 名字@RabbitListener(queues = RabbitMQConstant.RABBITMQ_DIRECT_QUEUE_NAME_KH96)public class RabbitMQDirectConsumerOne {/*** @author : huayu* @date: 1/11/2022* @param: [directMsgJson]* @return : void* @description : Direct 直连模式消费者One,消费信息*///指定消息队列中的消息,交给对应的方法处理@RabbitHandlerpublic void consumeOneDirectMsgFromDirectQueue(String directMsgJson){log.info("***** Direct直连模式,消费者One,消费消息:{} ******",directMsgJson);// TODO 核心业务逻辑处理//默认自动确认,模拟消费端消费消息,处理异常,自动重试int a = 10 / 0;}}

推荐阅读