https://blog.youkuaiyun.com/z69183787/article/details/88534988
当对消息设置存活过期时间时,消息超过时间仍然未被消费,则会自动移动到死信队列中。DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。
producer.setTimeToLive(1);//设置消息的存活时间
producer.send(message);
死信队列有两种模式:
sharedDeadLetterStrategy :
共享队列,所有问题消息,都保存在共有的一个队列中;这是ActiveMQ的默认策略;
individualDeadLetterStrategy :
将问题消息,保存到各自的队列中,队列名字不同,对于Queue模式,队列的名字前缀是ActiveMQ.DLQ.Queue;对于Topic,队列名字前缀为ActiveMQ.DLQ.Topic。
修改死信队列名称
<policyEntry queue="f" prioritizedMessages="true" >
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLxxQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
</policyEntry>
useQueueForQueueMessages: 设置使用队列保存死信,还可以设置useQueueForTopicMessages,使用Topic来保存死信
默认只有持久化的消息才可能进死信队列,如果要非持久化的消息也可以进入死信队列,可以通过修改配置文件实现。
让非持久化的消息也进入死信队列processNonPersistent="true"
<individualDeadLetterStrategy queuePrefix="DLxxQ." useQueueForQueueMessages="true" processNonPersistent="true" />
过期消息不进死信队列
<individualDeadLetterStrategy processExpired="false" />
以上提到的配置可以实现死信丢弃,即不保留。
当然,消费端可以通过直接指定死信队列的名称,进行再次消费。
Queue queue = session.createQueue("ActiveMQ.DLQ");