rabbitmq丢消息的处理方法

原创 2013年12月05日 11:31:56
最近发现系统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()+"]=========");
 }
}

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

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


activeMQ消息阻塞 丢失 假死--架构

jms有三部分组成。生产者,中间件(broker),消费者 , 生产者,中间件(broker),消费者  JMSDeliveryMode  NON_PERSISTENT 非持久化 表...
  • maikelsong
  • maikelsong
  • 2017年02月20日 21:24
  • 8734

[问题记录]解决RabbitMQ消息丢失与重复消费问题

本文仅记录排查和问题定位、解决的过程
  • yeweiouyang
  • yeweiouyang
  • 2017年07月11日 16:27
  • 9190

轻松搞定RabbitMQ(三)——消息应答与消息持久化

这个官网的第二个例子中的消息应答和消息持久化部分。我把它摘出来作为单独的一块儿来分享。 Message acknowledgment(消息应答)        执行一个任务可能需要花费几秒钟,你可能会...
  • xiaoxian8023
  • xiaoxian8023
  • 2015年09月24日 18:48
  • 14286

Spring AMQP - Publisher Confirms解决MQ丢消息

事务(Transactional)或发布确认(Publisher Confirms / aka Publisher Acknowledgements)机制可保证消息被正确投递,即从理论上来说MQ不会丢...
  • ujsleo
  • ujsleo
  • 2017年03月23日 16:48
  • 1474

如何保证RabbitMQ的消息不丢失及其背后的原理

一、消息为什么丢失RabbitMQ默认情况下的交换机和队列以及消息是非持久化的,也就是说在服务器重启或者宕机恢复后,之前创建的交换机和队列都将不复存在,之前未消费的消息也就消失不见了。原因在于每个队列...
  • qbian
  • qbian
  • 2017年04月16日 21:02
  • 2890

spring boot实战(第十二篇)整合RabbitMQ

前言 本篇主要讲述Spring Boot与RabbitMQ的整合,内容非常简单,纯API的调用操作。  消息生产者 不论是创建消息消费者或生产者都需要ConnectionFactory C...
  • liaokailin
  • liaokailin
  • 2015年11月01日 16:44
  • 55678

AmqpTemplate-发送-接收-消息

AmqpTemplate-简介     就像Spring Framework和其它一些项目提供了一些高度抽象,Spring AMQP提供的‘template’扮演者关键的角色。定义者...
  • sn_gis
  • sn_gis
  • 2014年11月17日 12:40
  • 8078

RabbitMQ(五)消息发送失败后的处理

前一篇文章,写了消息发送确认的一些内容. 就是消息发送成功或失败的时候,都会调用confirmListener 或者returnListener. 如果消息发送成功,就不考虑了.当消息发送失败时,怎么...
  • qq315737546
  • qq315737546
  • 2017年03月26日 14:39
  • 3180

RabbitMQ 防止消息丢失

1、消息确认 2、消息的持久化
  • meifage
  • meifage
  • 2017年05月11日 23:05
  • 523

rabbitmq 命令介绍

Rabbitmq服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。 总共有 5 个命令行工具,分别是:   1.  rabbitmqctl  ...
  • wjh_penglei
  • wjh_penglei
  • 2013年12月20日 14:30
  • 1794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rabbitmq丢消息的处理方法
举报原因:
原因补充:

(最多只允许输入30个字)