ActiveMQ 中的死信处理有哪些实现方式?

ActiveMQ 中的死信处理主要有以下几种方式实现:

  1. 在目标队列或主题配置死信转发地址:消费者无法消费的消息会自动转发到该地址。
<deadLetterStrategy>
   <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
</deadLetterStrategy>

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