У меня есть клиент 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
(теперь прокомментированный) во фрагмент кода выше. Следуя документации по интерфейсу, мы имеем:
Когда этот метод вызывается, он не должен возвращаться, пока обработка сообщений не будет остановлена упорядоченным образом. Это означает, что все прослушиватели сообщений, которые могли быть запущены, вернулись, и что все ожидающие получения вернулись.
Это НЕ мой случай, потому что я знаю, что все сообщения были обработаны.
Любой намек, почему это иногда не работает?