Лучше всего иметь JMSPublisher внедрить javax.jms.Exception слушатель. Реализуйте метод connect () , который безопасно устанавливает соединение при:
- StartService
- 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 , указывающие, что соединение имеет были потеряны и очищены / повторно приобретены при получении уведомления.