2015-09-03 1 views
3

Может ли свойство, разделенное запятой, определять очереди для прослушивания? Цель состоит в том, чтобы иметь возможность изменять имена очередей и количество очередей без изменения кода.@RabbitListener - определение очередей из свойств

Я определил очереди в моем application.properties так:

my.aggregate.queues=/some/queue,/some/other/queue 

Я могу включать имена очереди как списки с помощью SpEL, как так:

@Value("#{'${my.aggregate.queues}'.split(',')}") 

Однако, когда я пытаю для прослушивания очередей с использованием аннотации @RabbitListener. Я нахожу, что я должен определить очереди отдельно. Использование

@RabbitListener(queues = { "#{'${my.aggregate.queues}'.split(',')}" }) 

вызывает имена очередей должны быть решены в виде массива строк, но не один, способный быть использованы:

@RabbitListener can't resolve '[Ljava.lang.String;@5396eeb1' as either a String or a Queue 

Я пробовал различные другие комбинации SPEL без успеха. Есть ли способ использовать SpEL для динамического определения очередей?

ответ

1

Да; что SpEL поместит массив имен очередей в первый элемент массива queues.

Если вы откроете JIRA issue, есть шанс, что на следующей неделе мы сможем получить исправление в выпуске 1.5.

Я думаю, нам нужно принять выражение, которое оценивает строку с разделителями-запятыми, а затем выполняет разделение при обработке аннотации.

EDIT:

Однако, я просто понял, что RabbitMQ позволяет создавать очереди с запятыми в них, так что, возможно, мы просто должны справиться сам первый элемент массива является массивом.

+0

Спасибо, Гэри, я открою проблему. Я работал над этим программным способом. Было бы предпочтительным способ указания массива в аннотации @RabbitListener, и я согласен с вашим заключением в вашем редактировании. –

0

Вот программный способ решения вопроса:

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; 
} 
0

Если вы используете имя очереди в системной переменной «cluster.name», и необходимо настроить значение имени с условными, вы можете использовать Spel:

@RabbitListener(queues = "#{'${cluster.name}' != null?'batch.queue-${cluster.name}':'batch.queue'}", containerFactory = "listenerContainerFactory")