【问题标题】:Consume DirectExchange messages using routing key and exchange in spring boot在 Spring Boot 中使用路由密钥和交换使用 DirectExchange 消息
【发布时间】:2020-01-13 20:45:03
【问题描述】:

我正在尝试使用 退出队列 中的消息,该队列属于 Direct Exchange 类型(在交换和路由密钥的帮助下创建)。我只有 交换名称路由键没有队列名称。有对纯 Java 的支持,但我找不到用于 Spring 启动的地方。

@RabbitListener
    @RabbitHandler
    public void consumeMessage(Object message) {
        LOGGER.debug("Message Consumed.... : {}", message.toString());
    }

如何使用路由键和交换名称而不是队列名称作为@RabbitListener 要求queue 使用消息。

【问题讨论】:

  • 使用直接交换,路由键是队列名。
  • @theMayer @RabbitListener(queues = "${routing.key}") @RabbitHandler public void consumeMessage(Object message) { LOGGER.debug("Message Consumed.... : {}", message.toString()); } 这是一个例外 404 - reply-code=404, reply-text=NOT_FOUND - no queue
  • 你声明队列了吗?

标签: rabbitmq spring-rabbit


【解决方案1】:

消费者从队列而不是交换中消费。您必须使用路由键将队列绑定到交换器。

编辑

有几种方法可以在代理上自动声明队列。

    @RabbitListener(bindings = 
        @QueueBinding(exchange = @Exchange("myExchange"), 
            key = "myRk", value = @Queue("")))
    public void listen(String in) {
        System.out.println(in);
    }

这将绑定一个匿名队列(自动删除),该队列将在应用程序停止时被删除。

    @RabbitListener(bindings = 
        @QueueBinding(exchange = @Exchange("myExchange"), 
            key = "myRk", value = @Queue("foo")))
    public void listen(String in) {
        System.out.println(in);
    }

将永久队列foo 绑定到带有路由键的交换器。

您也可以简单地为队列、交换和绑定声明#Bean

Configuring the broker

【讨论】:

  • 我只获得了交换名称和路由密钥,而不是队列名称。
  • 因此您需要使用路由键将队列绑定到该交换,然后从该队列中消费。
  • 谢谢@Gary Russel。还有一个问题 - 如果连接或通道出现任何中断,我们是否有任何规定可以继续重试 RMQ 连接?
  • 你真的应该每次都问一个新问题——cmets 中的新问题并不能帮助人们找到答案。在消费者方面,侦听器容器将尝试每 5 秒重新连接一次(默认情况下)。在生产者方面,您可以将适当配置的RetryTemplate 添加到RabbitTemplate
  • 谢谢,它有效.... :) 从下次开始,我会将其作为问题发布。 @加里罗素
猜你喜欢
  • 2015-07-20
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2022-01-28
相关资源
最近更新 更多