Долгоживущие сеансы 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) {
        //
    }
Другие вопросы по тегам