当前位置: 首页 > news >正文

rabbitMq确认机制之ConfirmType

配置方式

 @Bean(name = "connectionFactory")@Primarypublic ConnectionFactory normalConnectionFactory(@Value("${spring.rabbitmq.username}") String username,@Value("${spring.rabbitmq.password}") String password,@Value("${spring.rabbitmq.addresses}") String address) {CachingConnectionFactory connectionFactory = new CachingConnectionFactory();connectionFactory.setAddresses(address);connectionFactory.setUsername(username);connectionFactory.setPassword(password);//   connectionFactory.setPublisherConfirms(true);connectionFactory.setPublisherReturns(true);connectionFactory.setPublisherConfirmType(CachingConnectionFactory.ConfirmType.CORRELATED);connectionFactory.setExecutor(createThreadPool(10,20,"mq-connection-","mq-connection-group"));return connectionFactory;}

或者配置文件里配置

spring:# RabbitMQ 配置项,对应 RabbitProperties 配置类rabbitmq:publisher-confirm-type: correlated

publisher-confirm-type属性有三个可选值:

  1. none(默认):关闭发布确认模式。
  2. correlated:消息从生产者发送到交换机后触发回调方法。
  3. simple:会触发回调方法,相当于单个确认(发一条确认一条)。在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是 waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker。

使用方式

SIMPLE模式

开启simple模式需要在invoke方法中一起执行 rabbitTemplate.waitForConfirms
同时也会收到回调,回调后结束阻塞,同时可以获取到返回结果。

  RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack){System.out.println(correlationData.toString() + "发送成功");}else {System.out.println(correlationData.toString() + "发送失败, 原因: " + cause);}}};rabbitTemplate.setConfirmCallback(confirmCallback);Boolean invoke = rabbitTemplate.invoke(operations -> {rabbitTemplate.convertAndSend("direct_exchange", "ROUTING_KEY_01", message, correlationData);return rabbitTemplate.waitForConfirms(1000l);});

CORRELATED模式

     RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack){System.out.println(correlationData.toString() + "发送成功");}else {System.out.println(correlationData.toString() + "发送失败, 原因: " + cause);}}};rabbitTemplate.setConfirmCallback(confirmCallback);rabbitTemplate.convertAndSend("direct_exchange", "ROUTING_KEY_01", message, correlationData);//    correlationData.getFuture().get();sleep(1000*60);System.out.println("发送消息boot mq hello Direct成功");

实现通过callback实现保证消息发送成功。

可以看出来,在开启publisher-confirm的情况下,如果不自行实现ConfirmCallback的逻辑,也无法做到保证消息成功发送。

可以在发送消息时更新为发送中。
收到callback更新为发送成功,或者发送失败。
对于发送失败的安排重试,可以在消息头加上重试次数记录重试次数,达到指定次数,更新为发送失败。

http://www.lryc.cn/news/249129.html

相关文章:

  • ubuntu下QT搭建Android开发环境
  • QT 做一个登录,注册的跳转页面
  • 数据库第十第十一章 恢复和并发简答题
  • Vue3:利用vueusejs键盘绑定
  • Python与设计模式--设计原则
  • Spire.Office 8.11.2 for NET fix Crack
  • ubuntu终端代理配置
  • postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程
  • 因为jsp for循环的一个空格引起的错误
  • 文件中找TopK问题
  • React 入门使用 (官方文档向 Part2)
  • vue运用之el-cascader组件
  • layui提示框没有渲染bug解决
  • MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(MODBUSTCP通信)
  • QT 项目中添加文件夹(分类文件)
  • vue3 语音播报流程
  • Linux MTR(My TraceRoute)command
  • 第十一章 python基础之api
  • redis运维(十六) 有序集合
  • 深入理解RC4加密算法
  • sql24(Leetcode1141查询近30天活跃用户数)
  • python爬取robomaster论坛数据,作为后端数据
  • C++: string的模拟实现
  • [安洵杯 2019]easy_web
  • CentOS7 安装配置SFTP服务器详解
  • 【Linux】Shell命令以及运行原理
  • vue-动态组件、keep-alive
  • 华为OD机试 - 执行任务赚积分(Java JS Python C)
  • 如何用CHAT配置linux的远程连接?
  • Python (十六) 错误和异常