Долгоживущие сеансы JMS. Хранение соединений JMS / сеансов JMS всегда открывало плохую практику?
Хранение JMS-соединений / сессий / потребителей всегда является плохой практикой?
Пример проекта кода:
// 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?
5 ответов
Это очень распространенная и приемлемая практика при работе с долгоживущими связями. Для многих JMS-серверов фактически предпочтительнее создавать новое соединение каждый раз, когда это необходимо.
Согласовано. Вот несколько полезных советов о том, как эффективно использовать JMS, в том числе поддерживать соединения / сеансы / производителей / потребителей.
Вы также можете проверить рекомендации по использованию транзакций, если вы заинтересованы в максимизации производительности.
Выбор сохранения соединения / сеанса / производителя / потребителя в течение длительного времени или нет должен основываться на частоте, с которой производитель / потребитель отправляет / принимает сообщения.
Если производитель отправляет или потребитель часто получает сообщения, тогда соединения / сеансы / производитель / потребитель должны оставаться открытыми. С другой стороны, если отправка / получение сообщений происходит нечасто, то держать эти открытые объекты JMS нехорошо будет, что потребляет системные ресурсы, такие как сокеты.
В нашем приложении у нас будут подключения / сеансы / потребители / производители, открытые в течение нескольких месяцев. Нам пришлось работать с нашим поставщиком (BEA), чтобы сделать это надежно. Но любые проблемы с этим - ошибка, которую поставщик должен исправить.
К вашему сведению, нет необходимости закрывать сеансы, производителей и потребителей закрытого соединения ( javax.jms.Connection). Приведенного ниже кода должно быть достаточно для освобождения ресурсов:
try {
this.connection.close();
} catch (JMSException e) {
//
}