Как использовать jms.Connection.setExceptionListner для освобождения ресурсов и повторного подключения? - PullRequest
1 голос
/ 08 ноября 2010


Предполагается, что у меня есть один Connection на JVM (реализован как синглтон) в качестве производной от документов, которые рекомендуют иметь один Connection в качестве тяжелого объекта.

Из документов:

... соединение является относительно тяжелым объектом.Большинство клиентов будут делать все свои сообщения с помощью одного соединения ... Клиент JMS обычно создает соединение, один или несколько сеансов и несколько производителей и потребителей сообщений.

Я пытаюсьрешить, что делать с моими Sessions, Producers и Consumers относительно ExceptionListener, который находится на уровне Connection.
Насколько я понимаю, вполне разумно, что они больше не являютсяможно использовать, когда выбрасывается JMSException, но я не уверен, что следует делать после запуска вышеуказанного слушателя.
Мои Sessions хранятся в ThreadLocal<Session>, который также хранится в одиночном.
Я могу использовать это для вызова MySessionSingleton.closeSession() в слушателе, но это закроет только Session, который связан с потоком, в который было сгенерировано исключение, а не все остальные Sessions.
Кроме того, это делаетне заботиться о Производителях \ Потребителях и их переподключении.
Возможное решение, которое я видел использованным, и я не хочу имитировать, - это иметь Соединение и Сессию для каждого Производителя \ Потребителя, и поэтому яможет контролировать все вышеперечисленное.

Буду признателен за любые мысли,
Иттай
Пояснение:
Моя текущая реализация, написанная бывшим программистом, - это та, которую я упоминаю выше как используемая, иСамая большая проблема для меня заключается в том, что мне нужно, чтобы несколько производителей и потребителей использовали один и тот же Session, так как мне нужны транзакции JTA, и я думаю (может быть неправильно), что мне нужны эти Производители \ Потребители для совместного использования сессии.
Соединение было производным от этого решения.
Так что, в принципе, даже если я сохраняю отношения одного сеанса на соединение, у меня все еще остается вышеупомянутая проблема, когда в одном сеансе есть несколько производителей \ потребителей.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Может быть, это наивный вопрос, так как у меня не так много опыта работы с JMS, но разве это не самый простой способ вызвать connection.close ()?

API JMS говорит, что «Нет необходимости закрывать сеансы, производителей и потребителей закрытого соединения».

Дополнительно, глобальный флаг может быть установлен как сигнал для циклов обработчика сообщений и т. Д.

0 голосов
/ 08 ноября 2010

Я до сих пор не понимаю, почему вам нужен только один объект Connection :-).Я бы позволил серверу приложений (я полагаю, что вы работаете на одном из них) позаботиться об управлении ресурсами Соединения для вас.

, т. Е. Используйте ConnectionFactory, чтобы получить ваши Соединения и создать сеанс и потребителей ипроизводители от этого.

Что-то примерно так:

public void notify(String errorOccurrence)
{
    Connection connection = null;

    try
    {
        connection = connectionFactory.createConnection();

        Session session = connection.createSession(true, 
                          javax.jms.Session.AUTO_ACKNOWLEDGE);

        TextMessage message = session.createTextMessage(errorOccurrence);

        MessageProducer messageProducer = 
                            session.createProducer(errorOccurrenceChannel);

        messageProducer.send(message);
    }
    catch (JMSException e)
    {
        handleJmsExcption(e);
    }
    finally
    {
        if (connection != null)
        {
            try
            {
                connection.close();
            }
            catch (JMSException e)
            {
                handleJmsExcption(e);
            }
        }
    }
}
...