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")