Как приостановить / возобновить прослушивание отдельных сообщений Spring JMS - PullRequest
0 голосов
/ 24 апреля 2019

My Spring Boot JMS-приложение потребляет сообщения из нескольких очередей SQS. Каждая очередь должна подключаться к своему внешнему ресурсу для обработки своих сообщений. Если произойдет сбой внешнего ресурса, я ожидаю, что потребитель, требующий этого ресурса, быстро истощит очередь до DLQ, и это неинтересно.

Мне нужно иметь возможность приостанавливать (приостанавливать) прослушиватель сообщений для каждого потребителя независимо, когда мой код обнаруживает, что его ресурс отключен (например, исключение comms вызывает вызывающую конечную точку REST).

Как я могу это сделать?

После поиска поддержки платформы для этого я обнаружил AbstractJmsListeningContainer, который (через интерфейс Lifecycle) поддерживает методы stop () и start (), хотя и не документирует, может ли запуск вызываться после вызова остановки.

Меня беспокоит то, что среди моих аннотированных потребителей @JmsListener есть один общий экземпляр; поэтому остановка одной очереди останавливает их всех, и я не хочу этого.

Как мне достичь своей конечной цели - приостановить работу отдельных потребителей?

Я видел ссылки на использование нескольких определений бинов, например так:

@Bean
SimpleMessageListenerContainer container1(ConnectionFactory connectionFactory,
        MessageListenerAdapter listenerAdapter) {
// snip
}

@Bean
SimpleMessageListenerContainer container2(ConnectionFactory connectionFactory,
        MessageListenerAdapter listenerAdapter) {
// snip
}

... но никогда не видел никаких объяснений о том, как и когда один из них будет использоваться по сравнению с другим.

1 Ответ

0 голосов
/ 24 апреля 2019

Смотрите мой ответ на этот вопрос .

Да, вы можете позвонить start() после stop().

Обратите внимание, что stop() останавливает только потоки; соединение остается открытым.

Если вы хотите закрыть все, позвоните shutDown() после stop(), а затем initialize() до start().

Вы не должны вызывать stop() в потоке слушателя, однако - передайте его другому потоку и подождите, пока isRunning() не станет ложным.

...