Spring RabbitMQ SimpleRabbitListenerContainerFactory использование

1

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

Я вижу, что последняя версия 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" />

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

Теги:
spring
spring-integration
rabbitmq
spring-rabbitmq

1 ответ

1
Лучший ответ

Прежде всего, вы не должны делиться одним и тем же 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.

Дайте мне знать, если я пропустил что-нибудь.

  • 0
    Извините за поздний ответ. так вы говорите один адаптер для разных queues . Каждая очередь будет иметь свою собственную (разную) полезную нагрузку. Почему мы должны объединиться в один адаптер? так что нам нужно иметь несколько listenerContainerFactory для каждой queue ? Почему он называется Factory , я подумал, что это единственная точка подключения для прослушивания нескольких очередей !!
  • 0
    Ой! Извините, я действительно пропустил эту часть. Нет, вы не можете использовать SimpleRabbitListenerContainerFactory для <int-amqp:inbound-channel-adapter> . Его цель - настройка аннотации @RabbitListener . Для конфигурации XML вы должны использовать определение компонента SimpleMessageListenerContainer . И да: отдельный компонент для каждого <int-amqp:inbound-channel-adapter> . Или просто положитесь на контейнер по умолчанию из <int-amqp:inbound-channel-adapter>
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню