java如何在从一个队列铲到另一个队列后拒绝消息?
通过Spring和RabbitMQ,我建立了两个主题交换x
和dlx
,以及两个队列q
和dlq
q
与x
和dlq
与dlx
结合dlx
被配置为q
的死信交换
当q
中的消息被拒绝(取消队列)时,它将成功发送到dlx
,然后发送到dlq
现在,我使用Spook插件将dlq
中的死信消息移回q
。只要这次成功地处理了消息(ack),此操作就会成功
但是,如果在q
中铲取的其中一条消息再次被拒绝,它将被无声地丢弃。我希望它能再次发送到DLXdlx
。我是否配置错误,或者我是否误解了DLX或铲子的概念
# 1 楼答案
我不认为你的问题是周期。假设您使用的是Rabbit management GUI中的Spoot插件,这会将消息的路由键更改为显式使用“默认Exchange”上队列的路由键
https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-default
根据上面的示例,我假设您具有以下设置:
q
参数-x-dead-letter-exchange = dlx
q
结合:test_message
dlq
结合:test_message
因此,如果您向
x
发送一条路由密钥为test_message
的消息,则其路由方式如下:q
q
中的使用者获取消息,发送nack,nack使用路由键test_message
发送给dlx
dlx
将dlq
配置为绑定到test_message
路由密钥,因此消息显示在dlq
现在,当您使用来自
dlq
的Spook插件将所有消息移动到q
中时,如下所示:然后它向
exchange = ''
和routing_key = 'q'
发送一条消息。它还从https://www.rabbitmq.com/dlx.html#using-optional-queue-arguments中指出:现在发生了这样的事情:
q
中,带有routing_key = q
x-dead-letter-routing-key
,因此它使用路由键q
向dlx
发送死信dlx
中的q,消息已丢弃2种可能的修复方法:
dlq
到routing_key = q
q
队列上的x-dead-letter-routing-key
以始终发送到死信上的相同路由密钥# 2 楼答案
我怀疑你是在玩这个
。。。因为你在铲。见Dead Letter Exchanges
相反,请使用TTL配置DLQ,并使用死信配置将过期消息路由回原始队列。这样,
x-death
头就获得了两个条目——1表示来自原始队列的拒绝,1表示来自DLQ的到期我猜,通过铲土,经纪人认为存在一个循环