2014-01-12 3 views
4

Я обрабатываю сообщения, используя JMS MessageConsumer с MessageListener. Если что-то происходит, это приводит к тому, что MessageConsumer перестает получать и обрабатывать сообщения - например, если базовое соединение закрывается - как я могу его обнаружить? Кажется, нет никакого механизма уведомления, который я могу найти в the spec.Обнаружение, когда асинхронный JMS MessageConsumer имеет исключение?

Я думаю, что вопрос ясен, как есть, но если вы хотите, чтобы я опубликовал код, чтобы прояснить вопрос, просто спросите!

В случае, если это важно, я использую ActiveMQ 5.8, хотя, очевидно, мне нужна схема, которая не зависит от реализации.

ответ

2

Использование ExceptionListener

Если система JMS обнаруживает проблему, он вызывает метод onException слушателя:

public class MyConsumer implements ExceptionListener, MessageListener { 

    private void init(){ 
     Connection connection = ... //create connection 
     connection.setExceptionListener(this); 
     connection.start(); 
    } 

    public void onException(JMSException e){ 
     String errorCode = e.getErrorCode(); 
     Exception ex = e.getLinkedException(); 
     //clean up resources, or, attempt to reconnect 
    } 

    public void onMessage(Message m){ 
     ... 
} 

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

+1

Знаю ли я, что JMS-брокер жив или нет? Как узнать, поддерживает ли JMS-соединение все в порядке? Может ли это сказать, является ли JMS-брокер онлайн? Благодарю. – tonga

+0

Вы устанавливаете 'ExceptionListener' на объект' Connection', правильно? Учитывая, что 'ExceptionListener' является' Connection'-scoped, что я буду ожидать от JMSException? Я подозреваю, что получаю исключения, относящиеся к моему «MessageConsumer», плюс еще много. Как я могу узнать, относится ли какое-либо данное исключение к моему «MessageConsumer», а не к чему-то еще в «Connection»? – sigpwned

+0

Исключение указывает, что экземпляр соединения не является хорошим, и его следует отбросить; попытайтесь открыть новый, используя цикл с временной задержкой между ними, чтобы дать серверу время для восстановления, в случае успеха, вот как вы знаете – raffian

Смежные вопросы