最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。

我们在本地模拟了wms发送打标消息的场景.

1. 有事务

2. 先发点对点队列, 再发订阅队列

3. 批量发送

4. 在生产环境与测试环境的RabbitMQ都进行了测试

我们在测试的时候都没有出现丢失队列的情况.

1、在RabbitMQ配置文件中,开启确认机制,如下:

<rabbit:connection-factory id="connectionFactory" publisher-confirms="true" addresses="${rabbitmq.host}" />

2、关闭amqpTemplate的事务(因为RabbitMQ官网给出的注释是confirm机制在事务情况下是不行的),如下图:

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
channel-transacted="false" message-converter="jsonMessageConverter"/>

3、做完这些操作以后,在代码中可以如下启用confirm方式, 这其中confirm中的ack如果为true,可以认为是RabbitMQ服务器已经成功接收了消息:

  rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
          @Override
          public void confirm(CorrelationData correlationData, boolean ack) {
              System.err.println(correlationData.getId() + ack);
          }
          });
 
/**
 * 
 * @Title: callJMSclient
 * @Description: TODO(发送打标的JMS通知信息)
 * @param @param textMessage
 * @param @return 设定文件
 * @return List<String> lstCommNo 商品编码List
 * @throws
 */
@Transactional(propagation = Propagation.NOT_SUPPORTED)
private void callJMSclient(String msg) {
 try {
//  rabbitTemplate.convertAndSend("wms.test.queue_direct", msg);
//  logger.info("+++p2p:["+msg+"]+++");
 rabbitTemplate.convertAndSend("amq.topic", "test.wms.usablestoragechanged.topic", msg,new CorrelationData("success:["+msg+"]"));
 logger.info("&&&p2s:["+msg+"]&&&");
 }catch (Exception e){
 logger.info("=============error:["+e.getMessage()+"]=========");
 }
}

这样就可以在日志里查看有没有消息发送失败。

令我们奇怪的是,当把事务去掉以后的,消息就不再丢失了,具体原因还待分析,先把消息确认的方法记录下哈。

rabbitmq丢消息的处理方法相关推荐

  1. 最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订

    最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制. 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订阅队列 3 ...

  2. RabbitMQ之消息持久化

    消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢--消息持久化. 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exch ...

  3. Kafka,ActiveMQ,RabbitMQ等消息队列使用的场景介绍

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:cws1214 blog.csdn.net/cws1214/article/deta ...

  4. 【RabbitMQ】消息应答--ack机制

    目录 消息应答 概念 自动应答 消息应答的方法 Multiple 的解释 手动应答实现 1.准备工具类 2.生产者 3.两个睡眠时间不同的消费者 4.效果展示 消息自动重新入队 效果演示: 消息应答 ...

  5. ①RabbitMQ 消息中间件/消息队列、单节点、集群、镜像集群

    文章目录 RabbitMQ 消息中间件/消息队列 1.消息中间件 1.简介 2.作用 消息中间件的两种模式 P2P模式 Rabbitmq Pub/Sub模式(发布/订阅:Topic,可以重复消费) K ...

  6. RabbitMQ 如何确保消息的成功投递?幂等性?顺序性?

    RabbitMQ 如何确保消息的成功投递?RabbitMQ 如何保证不重复消费,保证数据不丢失?分布式系统里,如何保证数据的一致性?一串连环炮你是否顶得住? 其实这几个问题的原理大同小异,都可以在统一 ...

  7. RabbitMQ 可靠消息传输实战--云平台技术栈12

    导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下其中的RabbitMQ! 作者:极客慧 https://my.oschina.net/jikeh/blog/2207127 可能是缓存架 ...

  8. RabbitMQ之消息确认机制(事务+Confirm)

    概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达brok ...

  9. RabbitMQ的消息确认ACK机制

    1.什么是消息确认ACK. 答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失.为了确保数据不会丢失,RabbitMQ支持消 ...

最新文章

  1. 设置grep高亮显示匹配项
  2. vue 往对象中添加键值对_【Vue】Vue学习之混入
  3. 技术方案——可控组播
  4. Entity Framework简介
  5. Flutter:删除所有已保存的shared_preferences首选项
  6. 怎样教一台计算机区分猫和狗?一文零基础入坑机器学习
  7. matlab实现查值,[数学建模(六)]使用MATLAB实现插值
  8. Binutils工具集中的一些比较常用的工具
  9. python和django的关系_Django一对一关系实践
  10. oracle怎么修改表字段长度,Oracle修改表结构字段名和字段长度
  11. 开放平台及其技术架构
  12. 【滤镜算法】低多边形风格介绍及Matlab实现
  13. Android查询通讯录信息
  14. python培训中心-python培训中心
  15. EtherCAT DC (学习笔记)
  16. 离散数学10:平面图与对偶图
  17. 最长不下降子序列O(NlogN) 输出序列
  18. 一个高颜值宝藏开源软件,跨平台终端神器 Tabby
  19. 教程:各种速查表汇总【后续继续更新】
  20. java邮件模板代码_java创建邮件模板

热门文章

  1. python 学习导图
  2. 依赖型的关系建立 - 小技巧
  3. 如何让产品用户拥有一流的上传体验
  4. 《Splunk智能运维实战》——第1章 游戏时间——导入数据 1.1 简介
  5. Bower介绍及用法(转)
  6. 腾讯云的云数据库MYSQL配置
  7. 如何在Windows7 x64 上安装oracle10g
  8. 马来游记(2)- 漂浮云顶间。。。
  9. SQL优化--使用关联查询代替子查询
  10. 奇安信代码安全实验室五人入选“2020微软 MSRC 最具价值安全研究者”榜单