如何在Rabbit中设置x-dead-letter-exchange?

Мак*_*кин 2 java rabbitmq spring-rabbit rabbitmq-exchange

这是我的豆子:

    @Bean
    public Queue igSmev3ListenerQueue() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-dead-letter-exchange", rabbitIgSmev3DlxProperties.getExchangeName());
        args.put("x-dead-letter-routing-key", rabbitIgSmev3DlxProperties.getRoutingKey());
        return new Queue(rabbitIgSmev3ListenerProperties.getQueueName(), true, false, false, args);
    }

    @Bean
    public Queue igSmev3DlxQueue() {
        return new Queue(rabbitIgSmev3DlxProperties.getQueueName(), true, false, false);
    }
Run Code Online (Sandbox Code Playgroud)

以下是 application.yml 设置:

listener:
  vhost: /
  exchangeName: igSmev3Listener
  queueName: igSmev3-ListenerQueue
  routingKey: igSmev3-Listener
dlx:
  vhost: /
  exchangeName: igSmev3Dlx
  queueName: igSmev3-DlxQueue
  routingKey: igSmev3-Dlx
Run Code Online (Sandbox Code Playgroud)

我目前的错误:

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-dead-letter-exchange' for queue 'igSmev3-ListenerQueue' in vhost '/': received none but current is the value 'igSmev3Dlx' of type 'longstr', class-id=50, method-id=10)
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我需要从 listenerQueue 中取出死信并将它们放入 dlxQueue

Art*_*lan 5

vhost '/' 中队列 'igSmev3-ListenerQueue' 的不等价 arg 'x-dead-letter-exchange':未收到但当前是类型 'longstr' 的值 'igSmev3Dlx'

这意味着您已经igSmev3-ListenerQueue在代理上有一个队列,并且没有“x-dead-letter-exchange”参数。可能您之前已经使用该状态创建了它。

在使用已提供的 DLX 启动应用程序之前,请考虑删除此队列。

  • 队列一旦创建就不可变;要更改参数,您必须首先删除现有队列。 (3认同)