ActiveMQ 中的死信处理主要有以下几种方式实现:
- 在目标队列或主题配置死信转发地址:消费者无法消费的消息会自动转发到该地址。
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
</deadLetterStrategy>
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" >
<!-- 设置死信队列 -->
<deadLetterStrategy>
<sharedDeadLetterStrategy topic="DLQ" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
- 在消息中设置 JMSXDeliveryCount 属性,当大于某值时转发至死信队列:
message.setIntProperty(JMSXDeliveryCount, 3); // 设置重发次数为3
producer.send(message);
- 消息监听器抛出异常,Broker 会自动转发至死信队列:
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
// 消息处理
} catch (Exception e) {
e.printStackTrace(); // 抛出异常,消息转发至死信队列
}
}
});
- 消息过期时自动转发至死信队列:可以在消息中设置过期时间JMSExpiration。
- 队列或主题中消息达到最大值时,转发新消息至死信队列:
<policyEntry topic=">" producerFlowControl="false" memoryLimit="1gb">
<pendingQueuePolicy>
< alternate >
<maxSize>1000</maxSize> <!-- 设置最大消息数 -->
</ alternate >
<flowControlProducer>true</flowControlProducer>
</pendingQueuePolicy>
</policyEntry>