Как обработать объект подключения к удаленному серверу jms - PullRequest
1 голос
/ 01 июля 2011

Мы используем приложение, которое содержит jboss @Service mbean, которое инкапсулирует объект javax.jms.Connection.

Во время запуска mbean соединение создается путем инициализации удаленного InitialContext, ищущего ConnectionFactoryИсходя из этого контекста и создавая соединение из этой фабрики:

@Service
public class JMSPublisher extends etcc.... {
   private Connection connection;
   protected void startService() {
      Context ctx = getRemoteInitialContext();
      ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("ConnectionFactory");
      connection = connectionFactory.createConnection();
   }
}

Мой вопрос: как долго мы можем поддерживать это соединение?На практике мы видим, что соединение выдает исключение JMSException, когда мы пытаемся создать для него сеанс через неопределенное количество времени.

В документации по Connection указано, что объект представляет собой сокет, поэтому таймауты из-за неактивностиможет быть нормальным.Но как мы можем справиться с этим, не создавая новых соединений для каждого сообщения?

1 Ответ

3 голосов
/ 03 июля 2011

Лучше всего иметь JMSPublisher внедрить javax.jms.Exception слушатель. Реализуйте метод connect () , который безопасно устанавливает соединение при:

  1. StartService
  2. OnException

Пара дополнительных очков:

  • Для сжатия кода просто приобретите фабрику соединений JMS через внедрение ресурсов. Ссылка на фабрику соединений будет разрешена до вызова startService и будет также действовать как неявная зависит , делая фабрику соединений JMS зависимостью для вашей службы.

  • Имеют JMSPublisher , расширяют org.jboss.system.ServiceMBeanSupport и реализуют интерфейс токена MBean ( JMSPublisherMBean ), который расширяет org. jboss.system.ServiceMBean . Это обеспечит соблюдение зависимостей при запуске (и остановке) службы.

Фабрика соединений JMS с вводом ресурса

@Resource(mappedName="ConnectionFactory") 
private javax.jms.ConnectionFactory connectionFactory;
private volatile javax.jms.Connection connection;

Модифицированный startService ()

public void startService() {
   connect();
}

Обработчик исключений при подключении

public void onException(JMSException je) {
   connect();
}

* Инициализатор безопасного подключения (добавление conn.start ()) *

private void synchronized connect() {
    log.info("Initializing Connection....");
    try {
        if(connection!=null) {
           try { connection.stop(); } catch (Exception e) {}
           try { connection.close(); } catch (Exception e) {}
        }
        connection = connectionFactory.createConnection();
        connection.setExceptionListener(this);
        connection.start();
    } catch (Exception e) {
        log.error("Failed to intialize JMS connection", e);
    }
}

Это не будет автоматически заботиться о других ресурсах JMS, выделенных через потерянное соединение, но если другие компоненты используют соединение, удерживаемое этим компонентом, вы можете опубликовать Уведомления JMX из JMSPublisher , указывающие, что соединение имеет были потеряны и очищены / повторно приобретены при получении уведомления.

...