如何从ActiveMQ Artemis消息中获取当前重试次数?
获取ActiveMQ Artemis Broker端重试的消息投递次数
方案1:利用JMS规范属性JMSXDeliveryCount
JMS规范定义的JMSXDeliveryCount属性由Broker维护,记录消息被投递的总次数(包含首次投递)。在Camel路由中可直接从JMS消息获取该值:
from("jms:queue:yourQueue") .process(exchange -> { Message jmsMessage = exchange.getIn(JmsMessage.class).getJmsMessage(); int deliveryCount = jmsMessage.getIntProperty("JMSXDeliveryCount"); // 首次投递值为1,每次重试递增1 System.out.println("当前投递次数:" + deliveryCount); }) .to("http://invalid-endpoint");
Qpid JMS客户端会自动映射AMQP协议的delivery-count到JMSXDeliveryCount属性,ActiveMQ Artemis作为AMQP Broker时会正确维护该值,此方案无需额外配置。
方案2:直接读取AMQP原生属性delivery-count
若JMSXDeliveryCount无法正常获取,可直接读取AMQP 1.0规范定义的原生属性:
from("jms:queue:yourQueue") .process(exchange -> { Message jmsMessage = exchange.getIn(JmsMessage.class).getJmsMessage(); int deliveryCount = jmsMessage.getIntProperty("delivery-count"); System.out.println("当前投递次数:" + deliveryCount); }) .to("http://invalid-endpoint");
ActiveMQ Artemis在重试投递时会自动递增该属性值,Qpid JMS客户端可直接访问。
方案3:Broker端配置自定义重试头
若上述方案失效,可通过修改ActiveMQ Artemis的broker.xml,让Broker在重试时注入自定义头:
<address-setting match="yourQueue"> <redelivery-delay>5000</redelivery-delay> <max-redeliveries>3</max-redeliveries> <!-- 配置重试时注入自定义头,${redelivery-count}为Broker内置变量 --> <redelivery-headers> <header name="X-Redelivery-Count" value="${redelivery-count}"/> </redelivery-headers> </address-setting>
之后在Camel路由中读取该自定义头:
from("jms:queue:yourQueue") .process(exchange -> { Integer redeliveryCount = exchange.getIn().getHeader("X-Redelivery-Count", Integer.class); // 首次投递值为0,每次重试递增1 System.out.println("当前重试次数:" + (redeliveryCount != null ? redeliveryCount : 0)); }) .to("http://invalid-endpoint");
此方案通过Broker主动注入头信息,避免了客户端自定义头在重试时丢失的问题。
内容的提问来源于stack exchange,提问作者GND
相关产品推荐
相关产品推荐

