如何设置ActiveMQ.DLQ队列的过期时间?

Kia*_*far 4 activemq-classic

作为一名操作人员(不是开发人员)并基于http://activemq.apache.org/message-redelivery-and-dlq-handling.html,我尝试在集成到JBoss中的ActiveMQ.DLQ上设置到期时间Fuse 6.2 确保 KahaDB 的文件夹不会超出磁盘空间,但以下设置似乎对队列消息没有任何作用,而是将它们复制到 ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ 两次。

...
<policyEntry queue=">" producerFlowControl="false">
    <deadLetterStrategy>
        <sharedDeadLetterStrategy expiration="300000"/>
    </deadLetterStrategy>
</policyEntry>
...
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,只需使用 JBOSS FUSE 管理控制台将消息发送到 ActiveMQ.DLQ 队列,并注意到生成了一个新队列,其数量是我发送入队的消息数量的两倍:

ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ  0   0  0  8  0  0
ActiveMQ.DLQ                                   4   0  0  4  0  0
Run Code Online (Sandbox Code Playgroud)

对此有什么想法吗?

Has*_*our 6

你的deadLetterStrategy功能很好并且必须工作正常,但你不能像这样测试它,因为过期时间是由尝试传递给消费者的业务代码设置的,当它失败时,它会通过更改过期时间将消息发送到 DLQ。您可以通过将(生存时间)设置为 1 来将消息发送到您想要的任何队列进行测试setJMSExpiration,例如,这样消息将不会被传递并直接发送到 DLQ if processExpired="true"

ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ被创建是因为您有一个生产者向 发送消息ActiveMQ.DLQ。因为您已向您发送了 4 条消息,ActiveMQ.DLQ您有 8 条消息,ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ因为该主题在生产者启动时收到一条消息,而在生产者停止消息时收到另一条消息,这意味着您的 JBOSS FUSE 管理控制台创建一个用于发送消息的连接,并在此之后停止它。

请注意,默认情况下,ActiveMQ 发送到 DLQ 的消息永远不会过期,如果你想将它们保留 7 天,你可以设置<sharedDeadLetterStrategy expiration="604800000" processExpired="true" processNonPersistent="true" />

http://activemq.apache.org/advisory-message.html

http://activemq.apache.org/message-redelivery-and-dlq-handling.html