Долгоживущие сеансы JMS.Является ли сохранение JMS-соединений / сеансов JMS всегда открытыми плохой практикой?
Вопрос
Является ли сохранение JMS-соединений / сеансов / consumer всегда открытыми плохой практикой?
Пример черновика кода:
// app startup code
ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME);
Connection connection = cf.createConnection(user,pass);
Session session = connection.createSession(true,Session.TRANSACTIONAL);
MessageConsumer consumer = session.createConsumer(new Queue(queueName));
consumer.setMessageListener(new MyListener());
connection.start();
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error
// ... Message are processed on MyListener asynchronously ...
// app shutdown code
consumer.close();
session.close();
connection.close();
Есть какие-либо предложения по улучшению этой схемы использования JMS?
Решение
Это очень распространенная и приемлемая практика при работе с долгоживущими связями. Для многих серверов JMS фактически предпочтительнее создавать новое соединение каждый раз, когда это необходимо. Р>
Другие советы
Согласен.Вот некоторые из них полезные советы о том, как эффективно использовать JMS что включает в себя отслеживание подключений / сеансов / производителей / потребителей.
Возможно, вы также захотите проверить рекомендации по использованию транзакций тоже, если вы заинтересованы в максимизации производительности.
Выбор сохранения соединения / сеанса / производителя / потребителя в течение длительного времени или нет, должен основываться на частоте, с которой производитель / потребитель отправляет / принимает сообщения. Р>
Если производитель отправляет или потребитель часто получает сообщения, тогда соединения / сеансы / производитель / потребитель должны оставаться открытыми. С другой стороны, если отправка / получение сообщений происходит нечасто, то держать эти открытые объекты JMS нехорошо будет, что потребляет системные ресурсы, такие как сокеты. Р>
В нашем приложении подключения / сеансы / потребители / производители будут открыты месяцами. Нам пришлось работать с нашим поставщиком (BEA), чтобы сделать это надежно. Но любые проблемы с этим - ошибка, которую поставщик должен исправить.
К вашему сведению, нет необходимости закрывать сеансы, производителей и потребителей закрытого соединения ( javax.jms.Connection ). Приведенного ниже кода должно быть достаточно для освобождения ресурсов:
try {
this.connection.close();
} catch (JMSException e) {
//
}