重试时更改RabbitMQ消息的标题和正文?

And*_*ell 7 rabbitmq

我已经看过博客文章,以及从这个问题回答#2 如何在RabbitMQ中设置一些重试尝试?建议在RabbitMQ消息上跟踪重试次数的一种方法是使用x-redelivered-count标头再次发布它.

这是通过在消息上设置标题来完成的,因为它将转向死信交换,或者通过使用与之前相同的标题和正文制作消息的新副本来完成,但加上增加x-redelivered-count(同时确认旧消息)消息的副本?),如果可以用前者完成,如何在消息被删除之前编辑消息的标题或正文?

the*_*yer 5

当你做一个basic.nack在RabbitMQ的,你告诉服务器是无法处理的消息。如果您配置了死信交换/队列,则如果设置,消息将被路由到那里requeue=false。您不能更改已发布到DLX的消息的内容,因为它们只是已发布原始消息的反映。

该线程表明,他们正在设法使服务器自动报告传递尝试的次数,但在当前版本的RabbitMQ中不会发生。

所以...目前,如果对于您来说重要的是知道您的代码尝试处理该消息的次数,则必须:

  1. 拒绝消息,设置requeue=false
  2. 使用原始交换和路由密钥再次发布消息,但是将所需的任何信息添加到标头中。从服务器的角度来看,这是一条全新的消息,它将被放置在队列的后面。

请注意,如果您的使用者在将任何肯定或否定的确认发送回服务器之前断开连接,消息仍可能会重新排队。在这种情况下,原始消息将按原样传递(没有自定义标头),并且redelivered会设置该标志。

  • 这太可怕了,我必须考虑这种解决方法,在取消消息之前仅设置自定义标头。 (2认同)