2016-09-10 5 views
0

Я столкнулся со странной проблемой.Tyrus Endpoint Blocks Thread in Glassfish (Payara)

Мое приложение (работает с Payara 4.1.1.163) использует Websockets для отправки сообщений между клиентами. Для этой функции используется TyrusRemoteEndpoint.

После развертывания он хорошо работает около 3-4 дней, а затем (если приложение не было развернуто или перераспределены на этот раз) Тир внезапно блокирует поток (или даже нити) при вызове функции:

session.getBasicRemote().sendObject(obj); 

Использование VisualVM Я сбросил все потоки и увидел следующее:

"http-thread-pool(56)" - Thread [email protected] 
    java.lang.Thread.State: WAITING 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <6929ab6a> (a java.util.concurrent.CountDownLatch$Sync) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) 
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) 
    at org.glassfish.tyrus.core.TyrusFuture.get(TyrusFuture.java:77) 
    at org.glassfish.tyrus.core.TyrusRemoteEndpoint$Basic.sendObject(TyrusRemoteEndpoint.java:183) 

Кажется, что эта нить держится в вечном ожидании. Сообщения для этого клиента не отправляются.

Если я использую синхронизированные блоки, это даже вызывает тупик, и все пулы HTTP-потоков (что касается веб-узлов) блокируются.

Что может вызвать такую ​​проблему? Как я могу с этим справиться? Должен ли я предоставить что-то еще? Спасибо заранее!

P.S. Я использую настройки Payara по умолчанию для пулов потоков (если это может помочь).

ответ

0

Похоже, что это bug в библиотеке tyrus-websocket.

Это может быть, по крайней мере решены путем восстановления приложения с использованием

getAsyncRemote()

вместо

getBasicRemote()

следующим образом :

Future<Void> f = session.getAsyncRemote().sendObject(...)   
try { 
    f.get(10, TimeUnit.SECONDS); 
} catch (InterruptedException e) { 
    throw new IOException(e); 
} catch (ExecutionException e) { 
    Throwable cause = e.getCause(); 
    if (cause instanceof IOException) { 
     throw (IOException) cause; 
    } else if (cause instanceof EncodeException) { 
     throw (EncodeException) cause; 
    } else { 
     throw new IOException(e); 
    } 
} catch (TimeoutException e) { 
    throw new IOException(e); 
} 

В этом случае мы используем тайм-аут и, по крайней мере, гарантируем, что наше приложение может быть восстановлено после этой проблемы.

Я также проверил this repository для новейшей версии тирара и не могу сказать, что они исправили проблему. Вероятно, это должно быть опубликовано как ошибка Payara или Glassfish.

 Смежные вопросы

  • Нет связанных вопросов^_^