Приостановить / возобновить работу JMS-прослушивателя с помощью автоматического выключателя Hystrix - PullRequest
0 голосов
/ 03 декабря 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

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

0 голосов
/ 03 декабря 2018

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

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

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

...