首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tyrus在玻璃鱼中阻止线程(Payara)

Tyrus在玻璃鱼中阻止线程(Payara)
EN

Stack Overflow用户
提问于 2016-09-10 09:54:30
回答 1查看 398关注 0票数 0

我正面临着奇怪的问题。

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

部署之后,它在3-4天左右运行良好,然后(如果这次没有部署或重新部署应用程序) tyrus在调用函数时突然阻塞线程(甚至线程):

代码语言:javascript
复制
session.getBasicRemote().sendObject(obj);

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

代码语言:javascript
复制
"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设置(如果可以的话)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 13:41:45

似乎这是tyrus库中的一个错误

至少可以通过恢复应用程序来解决

getAsyncRemote()

而不是

getBasicRemote()

以下列方式:

代码语言:javascript
复制
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,不能说他们已经解决了一个问题。也许它应该作为贝拉拉或玻璃鱼的一个bug发布。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39424868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档