RabbitListener 通过 ConfigurationProperties 注释队列名称

Jan*_*ski 4 rabbitmq spring-boot

我已经通过 application.yaml 和 spring configurationProperties 配置了我的兔子属性。因此,当我配置交换、队列和绑定时,我可以使用属性的 getter

@Bean Binding binding(Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(properties.getQueue());
}

@Bean Queue queue() {
    return new Queue(properties.getQueue(), true);
}

@Bean TopicExchange exchange() {
    return new TopicExchange(properties.getExchange());
}
Run Code Online (Sandbox Code Playgroud)

但是,当我配置 @RabbitListener 以记录队列中的消息时,我必须使用完整的属性名称,例如

 @RabbitListener(queues = "${some.long.path.to.the.queue.name}") 
 public void onMessage(
            final Message message, final Channel channel) throws Exception {
       log.info("receiving message: {}#{}", message, channel);
    }
Run Code Online (Sandbox Code Playgroud)

我想避免这种容易出错的硬编码字符串,并参考configurationProperties bean,如下所示:

@RabbitListener(queues = "${properties.getQueue()}") 
Run Code Online (Sandbox Code Playgroud)

我曾经在 @EventListener 中遇到过类似的问题,其中使用 bean 引用“@bean.method()”有所帮助,但它在这里不起作用,bean 表达式只是解释为队列名称,这会失败,因为队列名称“@bean” ....“ 不存在。

是否可以使用 ConfigurationProperty-Beans 进行 RabbitListener 队列配置?

Dav*_*ehl 8

这样的东西对我有用,我只使用了 Bean 和 SpEL。

@Autowired
Queue queue;

@RabbitListener(queues = "#{queue.getName()}")
Run Code Online (Sandbox Code Playgroud)