当前位置: 首页 > 知识库问答 >
问题:

Spring boot RabbitMQ Listener创建重复队列

任小云
2023-03-14

我有两个独立的应用程序,一个是生产者,一个是具有交换类型默认(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 listener的代码

  @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版本:<代码>

共有1个答案

潘弘博
2023-03-14

您尚未共享属性文件!

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

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

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 自动创建requirements.txt (8个答案) 2年前关闭。 我想知道如何为我的Python 3应用程序创建合适的requirements.txt? 问题答案: 在命令提示符下键入以下行

  • 我现有的使用阻止队列的代码创建了一个阻止队列列表(如私有列表 任何帮助将不胜感激。

  • 未创建我的exchange和dlq。我在下面的YML中有以下内容。我确实创建了一个匿名队列,但也没有发布消息。任何想法。

  • 我收到了一个关于这个问题的建议,一个评论,说我可能没有我需要的交换,因为我的队列已经存在。于是,我就全部手动删除了。 但是,在重新部署应用程序时,我发现所有队列都有以下异常: 我不确定这意味着什么,因为我显然想要创建队列<code>myInput。组,它似乎在抱怨它不存在。。。 我也检查了这个问题,我的问题可能是权限。但我应该有它们——否则我相信我无法删除队列...... 你能给我一个解决方案吗?

  • 问题内容: 这是我的情况: 当用户登录到我的网站时,我为给定的用户排队执行一系列任务(通常每个任务花费100毫秒的时间,每个用户有100毫秒的任务)。这些任务排队到默认的Celery队列中,而我有100的工人正在运行。我使用websockets在后端完成任务时向用户显示实时进度。如果我只有1个或2个用户处于活动状态,那么生活会很好。 现在,如果我有几个并发用户登录到我的站点,则后一个用户将排在初始