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()+"]=========");
 }
}

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

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


相关文章推荐

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

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

RabbitMQ消息队列(三):任务分发机制

在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题。在实际的应用场景中,这是远远不够的。从本篇文章开始,我们将结合更加实际的应用场景来...

RabbitMQ防止消息丢失

转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(3)— 消息的交换 1.简介 Rabbit...

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

本文仅记录排查和问题定位、解决的过程

Spring AMQP - Publisher Confirms解决MQ丢消息

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

rabbitmq丢消息的处理方法

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

[异步][jms][activeMq]如何做到重试机制不会导致一条消息被多次执行.

Message Queue ActiveMQ: redeliver,如何做到重试机制不会导致一条消息被多次执行.        http://stackoverflow.com/questions/4...
  • fei33423
  • fei33423
  • 2014年06月20日 18:24
  • 17365

spring rabbitmq 消息确认机制和事务支持

spring rabbitmq 消息确认机制和事务支持

rabbitmq的发布确认和事务

转:https://my.oschina.net/lzhaoqiang/blog/670749 摘要: 介绍confirm的工作机制。使用spring-amqp介绍事务以及发布确认的使用方式。因为事...

rabbitmq publisher(生产者)注意的几个点

一.rabbitmq publisher(生产者)注意的几个点 1.深刻理解异步模式 1.1默认情况,publisher->server,server不会将publisher的请求的执行情况,返回给p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rabbitmq丢消息的处理方法
举报原因:
原因补充:

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