Rabbitmq RabbitListener将队列绑定到多个交换机

Rabbitmq RabbitListener将队列绑定到多个交换机,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我希望能够利用RabbitListener注释将队列绑定到多个交换,但到目前为止还没有成功 我现在得到的是: @RabbitListener(bindings = @QueueBinding(value = @Queue( value = "${subscriber.queueInbound}", durable = "true", autoDelete = "false", exclusive = "false"), exchange = @Exchan

我希望能够利用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
}
这将在启动/重新连接时自动创建定义为订户的队列。queueInbound并将此队列绑定到默认的
all
交换

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

我想通过
@RabbitListener
或者以某种方式调整它,以便在重新连接时,让它在重新侦听之前适当地配置队列,来寻找一种更优雅的方法

最初我是通过bean进行队列配置的,但是如果RabbitMQ不可用,这会阻止应用程序的启动,我解决了这一问题,但会导致应用程序启动,并且不会执行队列配置步骤

@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) {

}
最初我是通过bean进行队列配置的,但是如果RabbitMQ不可用,这会阻止应用程序的启动,我解决了这一问题,但会导致应用程序启动,并且不会执行队列配置步骤

@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) {

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


bean仅在连接第一次打开时才在代理上声明。

是的,我意识到我的错误并正在努力纠正它,但是,我应该更清楚,我正在配置队列的交换机将来自配置文件,因此在运行时之前,我不知道要设置多少
@QueueBinding
;虽然更简单的
queues
属性可以使用SpEL返回
字符串[]
,例如
{${some.prop}.split(',')}
@QueueBinding
注释太复杂,无法实现类似的功能。