2015-09-03 39 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動態定義隊列的方法?

回答

1

是的; SpEL將在queues數組的第一個元素中放入一組隊列名稱。

如果您打開JIRA issue,我們有機會在下週發佈1.5版本。

我認爲我們需要接受一個表達式,該表達式用於逗號分隔的字符串,然後在處理註釋時進行分割。

編輯:

不過,我只是意識到,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」使用隊列名稱,需要自定義名稱值用條件時,可以使用的SpeI:

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