【问题标题】:Spring boot RabbitMQ Listener Creating Duplicate QueueSpring Boot RabbitMQ 监听器创建重复队列
【发布时间】:2021-10-10 14:30:00
【问题描述】:

我有两个独立的应用程序,一个用于生产者,一个是交换类型为 Default(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

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

@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-boot-version<version>2.5.2</version>

【问题讨论】:

    标签: rabbitmq spring-amqp spring-boot-2


    【解决方案1】:

    您还没有共享属性文件!

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

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

    【讨论】:

    • 正确,问题出在生产者方面,application.properties 的名称末尾有两个空格。我正在通过@Value("${q.name}")阅读属性。我认为默认情况下应用.trim()方法
    猜你喜欢
    • 2017-07-30
    • 2021-10-15
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2019-06-03
    相关资源
    最近更新 更多