Клиент Weblogic JMS генерирует DispatcherException при попытке зафиксировать после длительной обработки - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю над клиентом JMS для WebLogic 11g (WebLogic Server 10.3.6.0).Клиент основан на библиотеке wlthint3client.jar.Клиент использует асинхронный API (слушатели) для чтения сообщений из очереди JMS.Клиент является многопоточным и использует несколько параллельных потребителей JMS.

Сервер Weblogic JMS настроен на тайм-аут транзакции JMS, равный 10 минутам, но у меня возникают проблемы с фиксацией транзакций, длительность которых превышает 6 минут.Это происходит только тогда, когда одновременно происходит много длинных транзакций.

В таких случаях происходит сбой фиксации со следующим исключением:

weblogic.jms.common.JMSException: weblogic.messaging.dispatcher.DispatcherException: java.rmi.RemoteException: Could not establish a connection with -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server, java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
    java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
    java.rmi.ConnectException: Could not establish a connection with -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server, java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out; nested exception is:
    java.io.IOException: Bootstrap request to JVMID -6273788781435586093S:host:[7001,7001,-1,-1,-1,-1,-1]:domain:server got an error or timed out
    at weblogic.jms.dispatcher.DispatcherAdapter.convertToJMSExceptionAndThrow(DispatcherAdapter.java:116)
    at weblogic.jms.dispatcher.DispatcherAdapter.dispatchSyncNoTran(DispatcherAdapter.java:61)
    at weblogic.jms.client.JMSSession.commit(JMSSession.java:1224)
    at weblogic.jms.client.JMSSession.commit(JMSSession.java:1198)
    at weblogic.jms.client.WLSessionImpl.commit(WLSessionImpl.java:108)

Некоторые другие наблюдения:

  • Кажется, мой клиент может обрабатывать только 5 сообщений одновременно.У меня больше потребителей, скажем, 10, у меня больше доступных сообщений в очереди, но параллельно обрабатываются только 5.
  • Если я настраиваю клиента на использование <5 потребителей, то проблема не возникает.</li>
  • Если имеется <5 параллельных длинных транзакций - проблема не возникает </li>

1 Ответ

0 голосов
/ 15 февраля 2019

Таким образом, решение проблемы состоит в том, чтобы установить свойство на JVM, выполняющем клиентское приложение -Dweblogic.ThreadPoolSize=N+1, где N - количество асинхронных прослушивателей, используемых клиентом.

Если вы установите его равным N,и N сообщений получены и застряли более чем на 4 минуты, после чего ваша фиксация завершится неудачей с вышеупомянутым исключением.

Почему?Я предполагаю, что когда все потоки слушателей заняты обработкой входящих сообщений, там некому разговаривать с сервером и поддерживать соединение живым.Это подтверждается документацией Oracle по контрольным сигналам подключения T3 :

Любые две программы Java с допустимым подключением T3 - например, два экземпляра сервера или экземпляр сервера и клиент Java- использовать периодические двухточечные «биения» для объявления и определения непрерывной доступности [...]

и

Частота, с которой экземпляр сервера выдает биенияопределяется интервалом пульса, который по умолчанию составляет 60 секунд.

Количество пропущенных импульсов от однорангового узла, который экземпляр сервера ожидает, прежде чем принять решение о недоступности однорангового узла, определяется периодом пульса, который по умолчаниюравно 4. Следовательно, каждый экземпляр сервера ожидает до 240 секунд или 4 минут без сообщений (пульса или других сообщений) от однорангового узла, прежде чем решить, что одноранговый узел недоступен.

и вдругое место:

Пулы потоков клиента WebLogic настроены иначе, чем WebЛогические серверные пулы потоков не являются самонастраивающимися.Клиенты WebLogic имеют определенный пул потоков, который используется для обработки входящих запросов от сервера, таких как вызовы JMS MessageListener.Этот пул может быть настроен через свойство командной строки:

-Dweblogic.ThreadPoolSize = n

введите описание ссылки здесь

...