Уведомление об отключении/повторном подключении брокера AMQP с помощью Spring-AMQP/RabbitMQ

Одна из приятных особенностей Spring-AMQP заключается в том, что он, по-видимому, реализует необходимую логику для повторного подключения приложения Spring к брокеру сообщений, когда брокер выходит из строя и снова включается.

То, что я ищу, - это предпочтительный метод обнаружения, когда такие события отключения/повторного подключения происходят в приложении.

Лучшее, что я придумал до сих пор, — это механизм, похожий на опрос, когда я пытаюсь получить канал от фабрики соединений через регулярные промежутки времени.

Заранее спасибо!


person Bukes    schedule 15.10.2013    source источник


Ответы (1)


Не стесняйтесь открывать «Улучшение» JIRA Issue — мы можем выдать ApplicationEvent при потере соединения (и восстановлен); затем вы можете подписаться на это событие с помощью ApplicationListener.

Тем временем вы можете что-то сделать с помощью своей подсистемы ведения журналов — например, с помощью Log4J вы можете создать собственное приложение для получения журналов с категорией SimpleMessageListenerContainer, например...

16:05:50.042 WARN  [SimpleAsyncTaskExecutor-6][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer] Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: com.rabbitmq.client.ShutdownSignalException: connection error; reason: {#method<connection.close>(reply-code=320, reply-text=CONNECTION_FORCED - broker forced connection closure with reason 'shutdown', class-id=0, method-id=0), null, ""}

16:05:55.048 WARN  [SimpleAsyncTaskExecutor-7][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer] Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused

РЕДАКТИРОВАТЬ:

Существует также интерфейс ConnectionListener, реализацию которого вы можете зарегистрировать в фабрике соединений; вы можете узнать о новых соединениях с ним, но onClose() в настоящее время вызывается только тогда, когда соединение явно закрывается путем уничтожения фабрики.

Однако onCreate() дает вам дескриптор соединения, чтобы вы могли время от времени вызывать его метод isOpen(), но не делайте этого в самом методе onCreate() — сохраните соединение. Вы должны выйти из onCreate(), чтобы все работало по плану.

person Gary Russell    schedule 15.10.2013
comment
Добавлено примечание об интерфейсе ConnectionListener. - person Gary Russell; 16.10.2013
comment
Спасибо, Гэри, для этого я подал заявку на улучшение JIRA. У меня есть вопрос относительно вашего предложения WRT ConnectionListener. Выживет ли дескриптор соединения, полученный в onCreate(), как вы описываете, кролик, спускающийся и возвращающийся обратно? (например, isOpen() возвращает true до тех пор, пока брокер не выйдет из строя, false, пока брокер не работает, затем true, когда фабрика соединений восстановит подключение) - person Bukes; 16.10.2013
comment
Как только соединение будет закрыто, этот конкретный экземпляр никогда не вернет true из isOpen(). Однако, когда новое соединение будет установлено, ваш ConnectionListener будет снова вызываться, но на этот раз с новым соединением. - person Gary Russell; 16.10.2013