Из документов я хочу использовать потребление из очередей, динамически меняя потребителей без перезапуска приложения.
Я вижу, что последняя версия Spring RabbitMQ поддерживает то же самое, но нет подсказки/примера/объяснения, чтобы изменить то же самое. Я не мог видеть правильный исходный код для того же самого или как передать параметры, такие как maxConcurrentConsumers
Я использую основанную на XML конфигурацию Spring RabbitMQ вместе с интеграцией Spring
<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" />
Может ли кто-нибудь вести меня, как динамически настраивать потребителей?
Прежде всего, вы не должны делиться одним и тем же rabbitListenerContainerFactory
для разных <int-amqp:inbound-channel-adapter>
s, потому что они делают это:
protected void onInit() {
this.messageListenerContainer.setMessageListener(new ChannelAwareMessageListener() {
Таким образом, выигрывает только последний адаптер. С другой стороны даже нет причин иметь несколько адаптеров. Вы можете указать queue-names="highLoadQueue,lowLoadQueue"
для одного адаптера. Хотя в случае listener-container
вы должны указывать queues
на SimpleRabbitListenerContainerFactory
.
Если вы хотите изменить некоторые параметры rabbitListenerContainerFactory
во время выполнения, вы можете просто ввести его в какую-то службу и вызвать свои setters
.
Дайте мне знать, если я пропустил что-нибудь.
queues
. Каждая очередь будет иметь свою собственную (разную) полезную нагрузку. Почему мы должны объединиться в один адаптер? так что нам нужно иметь несколько listenerContainerFactory для каждойqueue
? Почему он называетсяFactory
, я подумал, что это единственная точка подключения для прослушивания нескольких очередей !!SimpleRabbitListenerContainerFactory
для<int-amqp:inbound-channel-adapter>
. Его цель - настройка аннотации@RabbitListener
. Для конфигурации XML вы должны использовать определение компонентаSimpleMessageListenerContainer
. И да: отдельный компонент для каждого<int-amqp:inbound-channel-adapter>
. Или просто положитесь на контейнер по умолчанию из<int-amqp:inbound-channel-adapter>