Как добиться параллелизма с помощью прослушивателя сообщений, не поддерживающего потоки

Ответ на этот вопрос объясняет, как использовать прототип область с <rabbit:listener-container/> в Spring AMQP, когда прослушиватель не является потокобезопасным.

Другой пользователь спросил (в комментарии), как настроить ту же среду, используя только конфигурацию Java.


person Gary Russell    schedule 21.01.2016    source источник


Ответы (1)


Как правило, лучше всего использовать bean-компоненты без сохранения состояния для прослушивателей, но когда это невозможно, для настройки прослушивателя области @Prototype (и нескольких контейнеров) с использованием только конфигурации Java вы можете использовать:

@Bean
public SimpleMessageListenerContainer container1() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames("test.mismatch");
    container.setMessageListener(new MessageListenerAdapter(listener()));
    container.setMismatchedQueuesFatal(true);
    return container;
}

...

@Bean
public SimpleMessageListenerContainer containerN() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());
    container.setQueueNames("test.mismatch");
    container.setMessageListener(new MessageListenerAdapter(listener()));
    container.setMismatchedQueuesFatal(true);
    return container;
}

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyNotThreadSafeListener listener() {
    return new MyNotThreadSafeListener();
}

Помните, что любые зависимости, введенные в MyNotThreadSafeListener, также должны быть bean-компонентами-прототипами.

Суть в том, что бобы без гражданства лучше всего.

person Gary Russell    schedule 21.01.2016