Spring boot @RabbitListener-从属性定义队列
是否可以使用逗号分隔属性定义要侦听的队列?其目的是能够在不更改代码的情况下更改队列名称和队列数量 我在我的Spring boot @RabbitListener-从属性定义队列,spring-boot,spring-amqp,Spring Boot,Spring Amqp,是否可以使用逗号分隔属性定义要侦听的队列?其目的是能够在不更改代码的情况下更改队列名称和队列数量 我在我的应用程序中定义了队列。属性如下: my.aggregate.queues=/some/queue,/some/other/queue 我可以使用as so将队列名称作为列表包括在内: 但是,当我尝试使用@RabbitListener注释侦听队列时,我发现必须单独定义队列。使用 @RabbitListener(queues = { "#{'${my.aggregate.queues}'.sp
应用程序中定义了队列。属性如下:
my.aggregate.queues=/some/queue,/some/other/queue
我可以使用as so将队列名称作为列表包括在内:
但是,当我尝试使用@RabbitListener
注释侦听队列时,我发现必须单独定义队列。使用
@RabbitListener(queues = { "#{'${my.aggregate.queues}'.split(',')}" })
使队列名称解析为字符串数组,但不能使用:
@RabbitListener can't resolve '[Ljava.lang.String;@5396eeb1' as either a String or a Queue
我尝试过其他各种SpEL组合,但都没有成功。有没有一种使用SpEL动态定义队列的方法?是的;该SpEL将把队列名称数组放在queues
数组的第一个元素中
如果你打开一个,我们有可能在下周发布的1.5版本中得到一个补丁
我认为我们需要接受一个计算结果为逗号分隔字符串的表达式,然后在处理注释时进行拆分
编辑:
但是,我刚刚意识到RabbitMQ允许您创建带有逗号的队列,因此我们可能只需要处理第一个数组元素本身就是一个数组。以下是解决此问题的编程解决方法:
private MethodRabbitListenerEndpoint createEndpoint() {
MethodRabbitListenerEndpoint endpoint = new MethodRabbitListenerEndpoint();
endpoint.setQueueNames(queues.toArray(new String[] {})); // auto wired in
endpoint.setAdmin(admin);
endpoint.setBean(interceptor);
endpoint.setId(ENDPOINT_ID);
endpoint.setMessageHandlerMethodFactory(createMethodFactory());
endpoint.setMethod(ReflectionUtils.findMethod(MyInterceptor.class, “myMethod”,
MyAbstractJsonSuperclass.class, Channel.class));
SimpleMessageListenerContainer container = listenerFactory.createListenerContainer(endpoint);
container.setupMessageListener(admin.getRabbitTemplate());
return endpoint;
}
private MessageHandlerMethodFactory createMethodFactory() {
DefaultMessageHandlerMethodFactory messageHandlerMethodFactory = new DefaultMessageHandlerMethodFactory();
messageHandlerMethodFactory.setMessageConverter(converter); // custom json converter
messageHandlerMethodFactory.afterPropertiesSet();
return messageHandlerMethodFactory;
}
如果使用系统变量“cluster.name”中的队列名称,并且需要使用条件自定义名称值,则可以使用Spel:
@RabbitListener(queues = "#{'${cluster.name}' != null?'batch.queue-${cluster.name}':'batch.queue'}", containerFactory = "listenerContainerFactory")
谢谢,加里,我会提出一个问题。我已经通过编程解决了这个问题。在@RabbitListener注释中指定数组的方法当然更可取,我同意您在编辑中的结论。
@RabbitListener(queues = "#{'${cluster.name}' != null?'batch.queue-${cluster.name}':'batch.queue'}", containerFactory = "listenerContainerFactory")