2015-04-10 3 views
1

От docs, я хочу использовать потребление из очередей, динамически меняя потребителей без перезапуска приложения.Spring RabbitMQ SimpleRabbitListenerContainerFactory использование

Я вижу, что версия Spring RabbitMQ поддерживает то же самое, но нет подсказки/примера/объяснения, чтобы изменить то же самое. Я не мог видеть соответствующий исходный код для того же самого или как пройти Params как maxConcurrentConsumers

Я использую конфигурации на основе XML-Спринг RabbitMQ наряду с пружинящей интеграции

<bean id="rabbitListenerContainerFactory" 
     class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory"> 
    <property name="connectionFactory" ref="rabbitConnectionFactory"/> 
    <property name="concurrentConsumers" value="3"/> 
    <property name="maxConcurrentConsumers" value="10"/> 
    <property name="acknowledgeMode" value="AUTO" /> 
</bean> 

<int-amqp:inbound-channel-adapter channel="lowInboundChannel" queue-names="lowLoadQueue" advice-chain="retryInterceptor" acknowledge-mode="AUTO" listener-container="rabbitListenerContainerFactory" /> 
<int-amqp:inbound-channel-adapter channel="highInboundChannel" queue-names="highLoadQueue" advice-chain="retryInterceptor" acknowledge-mode="AUTO" listener-container="rabbitListenerContainerFactory" /> 

Может кто-нибудь наставит меня, как динамически конфигурировать потребителей?

ответ

1

Прежде всего, вы не должны одни и те же rabbitListenerContainerFactory для различных <int-amqp:inbound-channel-adapter> с, потому что они делают это:

protected void onInit() { 
    this.messageListenerContainer.setMessageListener(new ChannelAwareMessageListener() { 

Таким образом, только последний адаптер выигрывает. С другой стороны, нет никаких причин иметь несколько адаптеров. Вы можете указать queue-names="highLoadQueue,lowLoadQueue" для одного адаптера. Хотя в случае listener-container вы должны указать queues на SimpleRabbitListenerContainerFactory.

Если вы хотите изменить некоторые параметры rabbitListenerContainerFactory во время выполнения, вы можете просто ввести его в какую-либо службу и вызвать его setters.

Сообщите мне, если я пропустил что-либо.

+0

извините за поздний ответ. поэтому вы говорите один адаптер для разных «очередей». Каждая очередь будет иметь свою (другую) полезную нагрузку. Почему мы должны объединяться в один адаптер? , так что нам нужно иметь несколько listenerContainerFactory для каждой очереди? Почему он называется «Factory», я думал, что это единственная точка подключения для прослушивания нескольких очередей! – Reddy

+0

О! Извините, я действительно пропустил эту часть. Нет, вы не можете использовать 'SimpleRabbitListenerContainerFactory' для' '. Его цель для конфигурации Annotation '@ RabbitListener'. Для конфигурации XML вы должны использовать определение bean-объекта SimpleMessageListenerContainer. И да: отдельный бит для каждого ''. Или просто полагайтесь на контейнер по умолчанию из '' –

+0

Я не мог понять, как все еще можно динамически менять потребителей. Не могли бы вы дать мне пример example/code/xml config? – Reddy