作为一个操作人员(不是开发人员)并且基于http://activemq.apache.org/message-redelivery-and-dlq-handling.html我试图在集成到JBoss Fuse 6.2中的ActiveMQ.DLQ上设置到期时间,以确保KahaDB的文件夹不会长出磁盘空间但是以下设置似乎对队列消息没有任何作用,而是将它们复制到ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ两次。
...
<policyEntry queue=">" producerFlowControl="false">
<deadLetterStrategy>
<sharedDeadLetterStrategy expiration="300000"/>
</deadLetterStrategy>
</policyEntry>
...
为了测试这个,只是使用JBOSS FUSE MANAGEMENT CONSOLE将消息发送到ActiveMQ.DLQ队列,并注意到生成了一个新队列,其中我发送的消息数量增加了两倍:
ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ 0 0 0 8 0 0
ActiveMQ.DLQ 4 0 0 4 0 0
有没有想过这个?
答案 0 :(得分:3)
你的deadLetterStrategy
是好的,必须正常工作,但你不能这样测试,因为到期是由试图传递给消费者的业务代码设置的,当它失败时它会通过以下方式将消息发送到DLQ:改变他们的到期日。
您可以通过将setJMSExpiration
(生存时间)设置为1来向所需的任何队列发送消息进行测试,例如,如果processExpired="true"
,则不会传递消息并将其直接发送到DLQ
ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ
是因为您有一个生产者已向ActiveMQ.DLQ
发送了消息。
由于您已向ActiveMQ.DLQ
发送了4封邮件,因此ActiveMQ.Advisory.Producer.Queue.ActiveMQ.DLQ
中有8封邮件,因为此主题会在制作人开始播放时收到消息。另一个当它停止消息时,这意味着您的JBOSS FUSE MANAGEMENT CONSOLE会创建一个用于发送消息的连接,并在此之后停止它。
请注意,默认情况下,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
答案 1 :(得分:0)
过期消息的默认操作是将其发送到DLQ。您需要避免处理过期的消息,这意味着:丢弃它们。在DLQ上添加Data-Message
可以解决问题。
(引自http://activemq.apache.org/message-redelivery-and-dlq-handling.html)
要告诉ActiveMQ只丢弃过期的消息,请在死信策略中将processExpired属性配置为false:
processExpired="false"