2016-08-30 49 views
1

我們有一個要求,我們在應用程序啓動時通過直接交換在rabbitMq中創建隊列,然後必須爲每個隊列分配一個偵聽器。我們使用Spring AMQP實現了以下配置並行偵聽兔子mq中的消息

@Bean(name= {"dispatcherListener"}) 
public SimpleMessageListenerContainer dispatcherListener() { 
    SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer(); 
    listenerContainer.setConnectionFactory(connectionFactory()); 
    listenerContainer.setQueues(participantQueues()); 
    listenerContainer.setMessageConverter(jsonMessageConverter()); 
    listenerContainer.setMessageListener(subscriptionListener); 
    listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO); 
    listenerContainer.setAutoStartup(false); 
    return listenerContainer; 
} 

但是後來我們遇到了上述配置的問題。當我們將消息發佈到多個隊列時,偵聽器將從每個隊列中順序讀取消息。但是我們期望它能夠平行地監聽來自每個隊列的消息而不依賴於其他隊列。

有人能指導我,我哪裏出錯了? 任何幫助,將不勝感激

回答

1

這是正確的行爲,因爲默認concurrency1,因此我們只有一個偵聽器的所有隊列。

只要考慮爲您的配置增加該值即可。

更多的信息在Reference Manual

+1

但是,如果您希望始終從同一個線程的相同隊列接收消息,則需要爲每個線程分別安裝一個容器。 –

+0

感謝您的回覆。我不會傾向於使用多個消費者,因爲消息的順序可能會丟失,對我來說它是高優先級的。創建一個單獨的容器會更好,但我可以在運行時創建偵聽器容器嗎? ,因爲新的隊列會動態創建,我需要爲每個容器分別設置一個容器 –

+0

是的,你可以知道你應該提供所有必需的應用程序上下文基礎結構。或者只是使用BeanFactory.initializeBeean()! –