Приостановить / возобновить прослушиватель JMS с помощью выключателя Hystrix

У нас есть прослушиватель JMS, который извлекает сообщения из MQ и сохраняет их в базе данных. Мой вопрос: как лучше всего временно приостановить прослушиватель JMS, пока db не работает, и возобновить его через некоторое время.

Я думал об использовании Spring Circuit Breaker для операции db, чтобы контролировать его работоспособность и вернуться к методу обработчика ошибок. Это поможет избежать ожидания тайм-аута БД каждый раз. Тем не менее, слушатель по-прежнему извлекает сообщения и пытается их сохранить, что приводит к потере ресурсов ЦП и сети.

Есть ли способ обработать события команд автоматического выключателя, такие как: открыто / полуоткрыто / закрыто? Затем я могу написать код для остановки JMS при возникновении события открытия цепи и запуска JMS при возникновении события полуоткрытия цепи.

Или как лучше всего временно приостановить прослушиватель JMS при сбое зависимости?

Примечание. Мы используем адаптер канала Spring Integration, управляемый сообщениями, для слушателя.


person sara    schedule 03.12.2018    source источник


Ответы (2)


Слушатель JMS - это Lifecycle bean, а также адаптер входящего канала JMS в Spring Integration. Это означает, что у них есть start()/stop() методы, что позволяет вам прекратить прием сообщений без остановки контекста приложения.

Что касается автоматического выключателя, я предполагаю, что вы говорите об одной из служб Spring Cloud. Если это так, то вам просто нужно вставить JMS-прослушиватель или адаптер в его реализацию и вызвать его start/stop методы. Но это в первую очередь предназначалось для внедрения распределенных микросервисов с автоматическими выключателями, что также подразумевает обнаружение сервисов и другие расширенные функции.

Если вы используете только один контекст приложения с интеграцией пружин (SI) для автоматического выключателя, вы можете воспользоваться преимуществами внутренней поддержки SI, описанной здесь.

person Oleg Zhurakousky    schedule 03.12.2018
comment
Спасибо за ответ. Да, JMS Listener имеет метод остановки / запуска, но вопрос в том, как интегрировать его с автоматическим выключателем Hystrix. Я обнаружил, что есть способ получить уведомление о событии Hystrix, но нет типа события, когда он переходит в полуоткрытое состояние: stackoverflow.com/questions/39957791 / - person sara; 04.12.2018
comment
Я не уверен, почему вас волнует полуоткрытость. Когда соединение с БД недоступно, я предполагаю, что произойдет сбой (исключение). Если вы заключите это в команду Hystrix, у вас будет возможность определить резервную операцию, где вы остановите прослушиватель JMS. В этот момент сообщения перестанут приходить. Когда соединение с БД снова появляется, вы перезапускаете слушателя, и все возвращается в норму. Если подумать, у вас на самом деле нет даже футляра для автоматического выключателя, поскольку все, что я только что описал, возможно без автоматического выключателя и проще. - person Oleg Zhurakousky; 04.12.2018

Для тех, у кого такая же проблема, после проверки кода библиотеки Hystrix Circuit Breaker я понял, что во-первых, нет никакого механизма для уведомления об изменении состояния цепи. Во-вторых, даже если бы события были там, это не решило бы мою проблему. Потому что полуоткрытое состояние достигается с первой попытки (сервисного вызова) после окна сна (когда цепь разомкнута). в то время как в моем случае, когда JMS Listener остановлен, следующей попытки / вызова не будет.

В конце концов, я разработал собственную библиотеку автоматических выключателей, которая запускает таймер / планировщик при размыкании цепи и автоматически переводит ее в полуоткрытое состояние при срабатывании таймера (окна сна).

person sara    schedule 20.12.2018