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
}
... но никогда не видел никаких объяснений о том, как и когда один из них будет использоваться по сравнению с другим.