使用Spring和RabbitMQ,我设置了两个主题交换x
和dlx
以及两个队列q
和dlq
。 q
绑定到x
,dlq
绑定到dlx
。 dlx
被配置为q
的死信交换。
当q
中的邮件被拒绝(不排队)时,它将成功发送到dlx
,然后发送到dlq
。
现在,我使用铲子插件将dlq
中的字母标记的邮件移回q
。只要这次成功处理了消息,此方法就成功工作(确认)。
但是,如果再次拒绝q
中的这些铲除消息之一,则会将其静默丢弃。我希望它将再次发送到DLX dlx
。我配置有误还是误解了DLX或铲子的概念?
最佳答案
我怀疑你在碰到这种味道...
可能形成消息死信的循环。例如,当队列将邮件死信到默认交换机而未指定死信路由键时,可能会发生这种情况。如果在整个周期中没有拒绝,则将丢弃此类周期中的消息(即两次到达同一队列的消息)。
...因为你是铲子。请参见Dead Letter Exchanges。
取而代之的是,将DLQ配置为TTL,并使用死信配置,这会使过期的邮件路由回到原始队列。这样,x-death
头将获得两个条目-1个来自原始队列的拒绝,1个来自DLQ的到期。
我猜想,通过铲子,经纪人认为这是一个周期。