Spring 引导 RabbitMQ 侦听器创建重复队列

Spring boot RabbitMQ Listener Creating Duplicate Queue

我有两个独立的应用程序,一个用于生产者,一个用于交换类型为默认 (DIRECT) 的消费者。

下面是 Rabbit MQ Producer 的配置以及死信队列设置。

    @Bean
    Queue dlq() {
        return QueueBuilder.durable(dlqQueueName).build();
    }

    @Bean
    Queue queue() {
        return QueueBuilder
                .durable(queueName)
                .withArgument("x-dead-letter-exchange", dlqExchange)
                .withArgument("x-dead-letter-routing-key", deadLetterRoutingKey)
                .withArgument("x-message-ttl",messageTTL)
                .build();
    }

    @Bean
    Binding binding() {
        return BindingBuilder.bind(queue()).to(exchange()).with(routingkey);
    }

    @Bean
    Binding dlqBinding() {
        return BindingBuilder.bind(dlq()).to(deadLetterExchange()).with(deadLetterRoutingKey);
    }

现在这是单独应用程序中 Rabbit MQ 侦听器 的代码。

  @Component
    public class RabbitMqConsumer implements MessageListener {
 
    
        @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${queuename}", durable = "true"),
                exchange = @Exchange(value = "exchange"),key = "routingkey"))
        public void message(MyClass o) {
                //save to db
        }
  @Override
    public void onMessage(Message message) {
        // TODO Auto-generated method stub

    }

现在,当我 运行 消费者服务时,它会创建一个具有相同名称的重复队列。如下图所示

Rabbit MQ GUI

我也在consumer中尝试了以下设置,但结果相同

@Bean
    public Queue queue() {
        return QueueBuilder
                .durable(env.getProperty("queue"))
                 .ttl(ttl)
                 .deadLetterExchange(ddlE)
                 .deadLetterRoutingKey(env.getProperty("dle.routingkey"))
                .build();
    }

注意:当我在生产者中添加死信队列设置时,这个问题开始出现,在这个设置之前,我有这个(下面提到)bean方法在消费者和生产者的配置 类 中,它工作正常。

 @Bean
        public Queue queue() {
            return new Queue(queueName,true);
        }

以上配置有什么问题吗?为什么它复制队列,我无法弄明白只是它们的功能不同

Spring-引导版本 : <version>2.5.2</version>

您还没有共享属性文件!

在 属性 文件中写入的队列名称末尾必须有一些隐藏字符或 spaces。

匹配消费者和生产者属性文件中的两个名称。应用程序之一(消费者或生产者)正在创建队列,其中 space 或隐藏字符作为队列名称的一部分!