Tyrus Endpoint阻塞了Glassfish (Payara)中的线程



我面临一个奇怪的问题。

我的应用程序(与Payara 4.1.1.163一起工作)使用Websockets在客户端之间发送消息。TyrusRemoteEndpoint用于此功能。

部署后,它可以正常工作3-4天,然后(如果应用程序没有部署或重新部署)tyrus在调用函数时突然阻塞线程(甚至线程):

session.getBasicRemote().sendObject(obj);

使用VisualVM,我已经转储了所有线程,并看到以下内容:

"http-thread-pool(56)" - Thread t@209
   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线程池(涉及websockets)都被阻塞。

是什么导致了这样的问题?我该怎么应付呢?我还需要提供什么吗?提前感谢!

注:我正在使用关于线程池的默认Payara设置(如果它可以帮助)。

似乎这是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);
}

在这种情况下,我们使用超时,至少确保我们的应用程序可以在此问题后恢复。

我也检查了这个仓库的最新版本的tyrus,不能说他们已经解决了一个问题。可能应该作为Payara或Glassfish的bug发布

相关内容

  • 没有找到相关文章

最新更新