Соединение закрыто, не возвращается - PullRequest
1 голос
/ 29 февраля 2012

У меня есть клиент JMS, который использует сообщения из очереди, используя следующий код:

    try {

        ...

        FileUtils.writeStringToFile(getNextFile(), txtMessage.getText());                   

    } catch (JMSException e) {
        LOG.error(e.getMessage());          
    } catch (IOException e) {
        LOG.error(e.getMessage());          
    }finally{
        if(this.openMessages<=0){
            try {
                if(transacted){
                    session.commit();
                    LOG.info("Session commited");
                }

                consumer.close();           

//              System.exit(0);             
                closeSession();                 

                System.exit(0);
            } catch (JMSException e) {
                LOG.error("Error while closing the consumer and session.", e);
            } catch (Exception e2) {
                LOG.error("Global Exception while closing the consumer and session.", e2);
            }           
        }           
    }

public void closeSession() throws JMSException {
    if (connection != null) {
        connection.stop();
        connection.close();
    }
}

После закрытия потребителя я хочу закрыть сеанс. Для закрытия он сделал вызов метода closeSession, который останавливает соединение и закрывает его. К сожалению, по какой-то причине иногда close НЕ возвращается. Поэтому я добавил оператор exit (теперь прокомментированный) во фрагмент кода выше. Следуя документации по интерфейсу, мы имеем:

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

Это НЕ мой случай, потому что я знаю, что все сообщения были обработаны.

Любой намек, почему это иногда не работает?

1 Ответ

0 голосов
/ 29 февраля 2012

Я не вижу причин для вызова System.exit(0) в вашем коде.

Я вижу много кода для остановки, но не вижу никакой обработки.

Ты обдумываешь это. Ваш MessageListener выглядит слишком сложным по сравнению с тем, как я делал это в прошлом. Я бы упростил. Слушателю не нужно исчезать и уничтожать JVM, на котором он работает. Все, что ему нужно сделать, это закончить, закрыть свое соединение и позволить серверу приложений поместить его обратно в пул, чтобы дождаться следующего сообщения, поступающего в очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...