activemq 如何开启死信队列

在以下三种情况中,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.开头+原来的队列名字的死亡队列,

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


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值