Долгоживущие сеансы JMS.Является ли сохранение JMS-соединений / сеансов JMS всегда открытыми плохой практикой?

StackOverflow https://stackoverflow.com/questions/274051

  •  07-07-2019
  •  | 
  •  

Вопрос

Является ли сохранение 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) {
        //
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top