Почему исключения SpyJMSExceptions все еще возникают после переработки клиентского соединения JBoss с удаленными очередями?
Проблема с соединением JNDI/JMS между JBoss 7.2.0 и JBoss 4.2.1
У меня есть приложение, которое работает как клиент на системе JBoss 7.2.0 и связывается с приемником JNDI/JMS на JBoss 4.2.1. Оно создает очереди для отправки и получения сообщений. В течение двух месяцев все работало прекрасно, без каких-либо изменений на обеих сторонах. Локальное клиентское приложение имеет установленные jbossall-client.jar
и jnp-client.jar
версии 4.2.1.
После нормальной работы мы начали получать исключение:
org.jboss.mq.SpyJMSException: Exiting on IOE; - nested throwable: (java.io.EOFException)
Мы перезапустили JBoss 7.2.0, ничего не меняя, и при создании очереди для получения сообщений получили новое исключение:
org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; {...} Caused by: java.io.EOFException
Это исключение возникает в строке:
QueueReceiver receiver = session.createReceiver(queue);
Такое же исключение также появляется после нескольких дней нормальной работы приложения, особенно после длительных периодов без активности.
Мы перезапустили систему JBoss 4.2.1, чтобы проверить, в этом ли проблема, но это не помогло. На самом деле, мы можем воспроизвести эту ситуацию, если оба системы подключены как обычно, а затем перезапустить систему 4.2.1. Ошибки начинают появляться, когда система 4.2.1 находится в состоянии выключения, и JBoss 7.2.0 не может восстановить соединения после повторного включения 4.2.1 (даже когда это должно быть возможно).
Остановка и перезапуск приложения в JBoss не решает проблему. Перезапуск JBoss имеет 20% шансов на успех (100% в случае принудительного сбоя, как описано выше). Обычно, удаление и повторное развертывание приложения также решает эту проблему.
Что может быть причиной этого?
Этот же WAR-файл работает без проблем в нашей тестовой системе с идентичной конфигурацией JBoss. Общение с целевой системой JBoss через тестовое приложение из командной строки работает исправно.
Я подозреваю, что проблема может быть в JBoss 7.2.0, или это может быть связано с истечением времени ожидания? Как можно проверить или увеличить время ожидания? Возможно ли сделать это с клиентской стороны? Даже если это замедление, я вызываю метод stop()
перед повторным подключением через start()
, и я все равно получаю это исключение; в этом случае это не должно быть связано с таймаутом, так как он бы сбросился.
Значения контекста:
connectionFactoryName=ConnectionFactory
contextFactoryName=org.jnp.interfaces.NamingContextFactory
packagePrefixes=org.jboss.naming:org.jnp.interfaces
providerUrl=MYSERVER:1099
Java-код:
(Приведенный код Java остается без изменений.)
Вывод логов:
(Вывод логов остается без изменений.)
Трассировка исключений после нормальной работы:
(Трассировка исключений остается без изменений.)
Трассировка исключений после перезапуска:
(Трассировка исключений остается без изменений.)
Надеюсь, кто-то сможет помочь разобраться с этой проблемой!
1 ответ(ов)
Как было указано в вопросе, сервер JBoss был обновлён с версии 4.2.1 до 7.1.1 Final. Обновление решило проблему, и клиент теперь работает как ожидается, но, к сожалению, это решение не объясняет саму проблему.
Как проверить, что в JUnit-тестах выбрасывается определенное исключение?
Можно ли перехватить несколько исключений Java в одном блоке catch?
Mockito: Тестирование void метода, который выбрасывает исключение
Java - MySQL: Не разрешено извлечение открытого ключа (Public Key Retrieval)
Как проверить, какой тип исключения был выброшен в Java?