activemq 如何开启死信队列

原创 2015年11月19日 16:10:36
在以下三种情况中,ActiveMQ消息会被重发给客户端/消费者: 
1.使用一个事务session,并且调用了rollback()方法; 
2.一个事务session,关闭之前调用了commit; 

3.在session中使用CLIENT_ACKNOWLEDGE签收模式,并且调用了Session.recover()方法。 

Broker根据自己的规则,通过BrokerInfo命令包和客户端建立连接,向客户端传送缺省发送策略。但是客户端可以使用ActiveMQConnection.getRedeliveryPolicy()方法覆盖override这个策略设置。 
Java代码  收藏代码
RedeliveryPolicy policy = connection.getRedeliveryPolicy();  
policy.setInitialRedeliveryDelay(500);  
policy.setBackOffMultiplier(2);  
policy.setUseExponentialBackOff(true);  
policy.setMaximumRedeliveries(2); 

xml配置如下

一旦消息重发尝试超过重发策略中配置的maximumRedeliveries(缺省为6次)时,会给broker发送一个"Poison ack",通知它,这个消息被认为是一个毒丸(a poison pill),接着broker会将这个消息发送到DLQ(Dead Letter Queue),以便后续分析处理。 


缺省死信队列(Dead Letter Queue)叫做ActiveMQ.DLQ;所有的未送达消息都会被发送到这个队列,以致会非常难于管理。你可以设置activemq.xml文件中的destination policy map的"individualDeadLetterStrategy"属性来修改.


开启死信队列 必需在事物开启的情况下才可以

listen代码如下

public class DefaultMessageListener implements MessageListener {

	private static Logger logger = LoggerFactory.getLogger("activeMQLog");

	private RyzhMessageReceiver receiver;

	public void onMessage(Message message) {
		logger.info("DefaultMessageListener 人员整合 :消费者开始消费");
		ObjectMessage objectMessage = (ObjectMessage) message;
		RyzhMessage ryzhMessage = null;
		try {
			ryzhMessage = (RyzhMessage) objectMessage.getObject();
			receiver.receive(ryzhMessage);
			int a =1/0;
			// 没有报错就确认消息接收
			// logger.info("DefaultMessageListener 人员整合:消费者消费成功1111111111111111111");
			// throw new JMSException("process failed");
			objectMessage.acknowledge();
			logger.info("DefaultMessageListener 人员整合:消费者消费成功");
		} catch (Exception e) {
			logger.error("DefaultMessageListener 人员整合:消费者消费时出现异常 ShcemeId:" + ryzhMessage.getShcemeId(), e);
			throw JmsUtils.convertJmsAccessException(new JMSException(e.getMessage()));
		}
	}

	public RyzhMessageReceiver getReceiver() {
		return receiver;
	}

	public void setReceiver(RyzhMessageReceiver receiver) {
		this.receiver = receiver;
	}

}

发送者代码如下

<span style="color:#666666;">public void send(final RyzhMessage ryzhMessage) {
		// 得到MQ工具类
		RyzhMqHolder hodler = mqHolders.get(ryzhMessage.getShcemeId());
		// 发送信息
		jmsTemplate.setConnectionFactory(cachingProductConnectionFactory);
		jmsTemplate.send(hodler.getDestination(), new MessageCreator() {
			public Message createMessage(Session session) throws JMSException {
				ObjectMessage objectMessage = session.createObjectMessage();
				objectMessage.setObject(ryzhMessage);
				</span><span style="color:#ff0000;">objectMessage.setJMSRedelivered(true);//消息重发</span><span style="color:#666666;">
				return objectMessage;
			}
		});
	}</span>


效果如下图 默认是发送到ActiveMQ.DLQ的死亡队列,修改mq配置之后重启,是发送到以DLQ.开头+原来的队列名字的死亡队列,

这时候原队列显示改消息已经被消费了,其实是发送到死亡队列里面去了


版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring ActiveMQ 整合(五): 死信队列

1.死信队列和回退队列的区别:  这篇文章写得非常到位:http://blog.csdn.net/coderepository/article/details/7023304 2.什么是死信队列:...
  • dly1580854879
  • dly1580854879
  • 2017年04月01日 17:44
  • 1301

ActiveMQ的消息重发与死信管理(DLQ)

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。 出现以下情况时,消息会被redelivered A transacted session is used a...
  • Leonardo9029
  • Leonardo9029
  • 2015年10月30日 16:47
  • 1780

spring activeMQ 整合(五): 死信队列

1.死信队列和回退队列的区别:  这篇文章写得非常到位:http://blog.csdn.NET/coderepository/article/details/7023304 2.什么是死信队列:...
  • romantic_PK
  • romantic_PK
  • 2017年08月02日 11:22
  • 191

ActiveMQ的消息重发与死信管理(DLQ)

摘自:http://blog.sina.com.cn/s/blog_3f77ac270100p2vr.html ActiveMQ的消息重发与死信管理(DLQ) (2011-03-29 22:0...
  • zfl092005
  • zfl092005
  • 2013年12月13日 16:35
  • 1184

ActiveMQ的消息重发与死信管理(DLQ)

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。 出现以下情况时,消息会被redelivered A transacted session is used...
  • lulongzhou_llz
  • lulongzhou_llz
  • 2014年07月07日 16:02
  • 3577

ActiveMQ的消息重发与死信管理(DLQ)

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。 出现以下情况时,消息会被redelivered A transacted session is ...
  • jsjw18
  • jsjw18
  • 2014年03月03日 11:03
  • 978

ActiveMQ的消息重发与死信管理(DLQ)

http://blog.sina.com.cn/s/blog_3f77ac270100p2vr.html DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息...
  • xiaxiaorui2003
  • xiaxiaorui2003
  • 2016年11月04日 09:52
  • 861

Rabbitmq消费失败死信队列

Rabbitmq 重消费处理一 处理流程图: 业务交换机:正常接收发送者,发送过来的消息,交换机类型topicAE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全...
  • qq_29778131
  • qq_29778131
  • 2016年09月14日 12:26
  • 6481

RabbitMQ之死信队列

DLX, Dead-Letter-Exchange。利用DLX, 当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个Exchange,这个Exchange就是...
  • u013256816
  • u013256816
  • 2017年02月08日 20:46
  • 6438

activemq的topic队列模式的maven,spring的demo

  • 2017年05月02日 14:08
  • 55KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:activemq 如何开启死信队列
举报原因:
原因补充:

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