有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在从一个队列铲到另一个队列后拒绝消息?

通过Spring和RabbitMQ,我建立了两个主题交换xdlx,以及两个队列qdlqqxdlqdlx结合dlx被配置为q的死信交换

q中的消息被拒绝(取消队列)时,它将成功发送到dlx,然后发送到dlq

现在,我使用Spook插件将dlq中的死信消息移回q。只要这次成功地处理了消息(ack),此操作就会成功

但是,如果在q中铲取的其中一条消息再次被拒绝,它将被无声地丢弃。我希望它能再次发送到DLXdlx。我是否配置错误,或者我是否误解了DLX或铲子的概念


共 (2) 个答案

  1. # 1 楼答案

    我不认为你的问题是周期。假设您使用的是Rabbit management GUI中的Spoot插件,这会将消息的路由键更改为显式使用“默认Exchange”上队列的路由键

    https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-default

    The default exchange is a direct exchange with no name (empty string) pre-declared by the broker. It has one special property that makes it very useful for simple applications: every queue that is created is automatically bound to it with a routing key which is the same as the queue name.

    根据上面的示例,我假设您具有以下设置:

    • q参数-x-dead-letter-exchange = dlx
    • q结合:test_message
    • dlq结合:test_message

    因此,如果您向x发送一条路由密钥为test_message的消息,则其路由方式如下:

    1. 出现在q
    2. q中的使用者获取消息,发送nack,nack使用路由键test_message发送给dlx
    3. dlxdlq配置为绑定到test_message路由密钥,因此消息显示在dlq

    现在,当您使用来自dlq的Spook插件将所有消息移动到q中时,如下所示:

    enter image description here

    然后它向exchange = ''routing_key = 'q'发送一条消息。它还从https://www.rabbitmq.com/dlx.html#using-optional-queue-arguments中指出:

    If this is not set, the message's own routing keys will be used.

    现在发生了这样的事情:

    1. 消息显示在q中,带有routing_key = q
    2. 由于没有配置x-dead-letter-routing-key,因此它使用路由键qdlx发送死信
    3. 没有绑定到dlx中的q,消息已丢弃

    2种可能的修复方法:

    1. 将另一个绑定添加到dlqrouting_key = q
    2. 手动配置q队列上的x-dead-letter-routing-key以始终发送到死信上的相同路由密钥
  2. # 2 楼答案

    我怀疑你是在玩这个

    It is possible to form a cycle of message dead-lettering. For instance, this can happen when a queue dead-letters messages to the default exchange without specifiying a dead-letter routing key. Messages in such cycles (i.e. messages that reach the same queue twice) will be dropped if there was no rejections in the entire cycle.

    。。。因为你在铲。见Dead Letter Exchanges

    相反,请使用TTL配置DLQ,并使用死信配置将过期消息路由回原始队列。这样,x-death头就获得了两个条目——1表示来自原始队列的拒绝,1表示来自DLQ的到期

    我猜,通过铲土,经纪人认为存在一个循环