2016-09-10 62 views
0

我面臨奇怪的問題。玻璃魚的Tyrus端點塊線程(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-thread-pools(涉及websockets)都被阻塞。

什麼會導致這樣的問題?我該如何應對?我需要提供其他東西嗎? 提前謝謝!

P.S.我正在使用關於線程池的默認Payara設置(如果可以的話)。

回答

0

似乎這是tyrus-websocket庫中的bug

可以至少通過回收使用

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爲最新版本的Tyrus,不能說他們已經修復了一個問題。可能它應該作爲Payara或Glassfish的bug發佈。