死信队列上来自交易所的消息的RabbitMQ怪异行为

时间:2019-04-25 16:17:12

标签: php rabbitmq php-amqplib

我正在将amqp库用于php作为Rabbitmq客户端,我们希望拒绝来自名为“测试”的队列的消息

为了不丢失此消息,我们定义了名为“ test.deadletter”的死信队列。

如果我们直接(通过Web界面)将消息添加到“测试”队列中,并通过amqplib客户端的basic.reject方法拒绝该消息,则该消息将正确地移至死信队列。

但是,如果我们使用某种交换(带有路由密钥)将消息放入测试队列,然后我们尝试拒绝此消息,则消息只会丢失。它不再位于测试队列中,也不再位于test.deadletter队列中。

消息是相同的,并且basic.reject方法的两个必需参数在两次尝试中都相同。只是事实是没有区别,该消息一次来自交换而另一次来自某些直接插入。

这是错误还是预期的行为?我想念的是什么?

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

Dead letter exchanges (DLXs) are normal exchanges。如果您的消息无法路由(例如,由于路由键),或者如果死信交换没有绑定任何队列,RabbitMQ将删除该消息。

我怀疑test.deadletter没有使用与发布消息相同的路由密钥绑定到死信交换。


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。