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


六 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;}}3.5.1.3 请求方法/*** @author : huayu* @date: 3/11/2022* @param: [ackMsg]* @return : com.kgc.scd.uitl.RequestResult<java.lang.String>* @description : 测试 消费者自动 重试*/@GetMapping("/consumeAckAuto")public RequestResult<String> testRabbitMQConsumeAckAuto(@RequestParam String ackMsg){log.info("------- 直连 模式 测试Ack 自动 重试,发送消息 -------");//模拟发送直连消息//消费消息失败重试机制rabbitMQDirectProducer.sendDirectMsg2DirectExchange(RabbitMQConstant.RABBITMQ_DIRECT_EXCHANGE_KH96,RabbitMQConstant.RABBITMQ_DIRECT_ROUTING_KEY_KH96,JSON.toJSONString(ackMsg));return ResultBuildUtil.success("使用直连模式 消费确认-自动消费成功");}3.5.1.4 请求测试发起请求:
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:
一共重试了五次
间隔时间为1,2,4,8
(如果还有一次应该为10,因为最后一次计算时间16大于最大间隔时间10,按最大间隔时间10重试);
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图

经验总结扩展阅读