【问题标题】:RabbitListener binding queue to multiple exchangesRabbitListener 绑定队列到多个交换器
【发布时间】:2017-11-01 16:50:09
【问题描述】:

我希望能够使用 RabbitListener 注释将一个队列绑定到多个交换,但到目前为止还没有成功。

我现在拥有的是:

@RabbitListener(bindings = @QueueBinding(value =
    @Queue(
        value = "${subscriber.queueInbound}", durable = "true", autoDelete = "false", exclusive = "false"),
        exchange = @Exchange(value = "all", durable = "true")
    ),
    containerFactory = "subscriberRabbitListenerContainerFactory"
)
public void onMessage(Message message, Channel channel) {
    // do something
}

这将在启动/重新连接时自动创建定义为subscriber.queueInbound 的队列并将此队列绑定到默认的all 交换。

然后我有一个在后台运行的作业,它将正确配置此队列并将其绑定到需要为其配置的多个交换。

我正在寻找一种更优雅的方式来执行此操作,或者通过@RabbitListener 或以某种方式对其进行调整,以便在重新连接时让它在重新收听之前适当地配置队列。

最初我是通过 Beans 进行队列配置,但是如果我解决了 RabbitMQ 不可用,这会阻止应用程序启动,但随后会导致它启动并且不执行队列配置步骤。

【问题讨论】:

    标签: rabbitmq spring-amqp spring-rabbit


    【解决方案1】:
    @RabbitListener(bindings = {
            @QueueBinding(value =
                @Queue(value = "foo"), exchange = @Exchange("ex1"), key="foo"),
            @QueueBinding(value =
                @Queue(value = "foo"), exchange = @Exchange("ex2"), key="bar")
    })
    public void listen(String in) {
    
    }
    

    最初我是通过 Beans 进行队列配置,但是如果我解决了 RabbitMQ 不可用,这会阻止应用程序启动,但随后会导致它启动并且不执行队列配置步骤。

    这意味着您在上下文初始化期间做了一些“非法”的事情。在完全构建上下文之前,您不应该尝试与 RabbitMQ 对话。

    仅在首次打开连接时在代理上声明 Bean。

    【讨论】:

    • 是的,我意识到我的错误并正在努力纠正它,但是我应该更清楚我正在配置队列的交换将来自配置文件,所以我不知道有多少@QueueBinding 设置到运行时。
    • 那么用注解就不行了;而更简单的queues 属性可以使用SpEL 返回String[],例如#{'${some.prop}'.split(',')} @QueueBinding 注释太复杂,无法实现类似的东西。
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多