Tomcat websocket TEXT_FULL_WRITING

3
在Tomcat 8.5.9中,session.getAsyncRemote().sendText()方法会抛出java.lang.IllegalStateException异常,错误信息为"The remote endpoint was in state [TEXT_FULL_WRITING]"。为了解决该问题,可以在调用send方法前加入互斥锁(mutex),在调用后释放该锁。
 sendMutex.acquireUninterruptibly();
    try{
      session.getAsyncRemote().sendText(gson.toJson(message));
    }catch(Exception exception){
      logger.error("Session : "+session.getId()+" message : "+gson.toJson(message)+" exception : "+exception.getMessage(),exception);
    }
    sendMutex.release();

当调用此方法时,仍会抛出异常。除了此方法外,没有调用session.getAsyncRemote().sendText()或session.getBasicRemote().sendText()。ServerEndpoint在onMessage方法中返回void。
谢谢。

我在论坛上找到了答案。在异步调用的未来完成之前,新的sendText调用会抛出IllegalStateException异常。 - saim doruklu
谢谢你,你是如何检查异步调用的状态以解决这个问题的? - egerardus
1个回答

0

一直遇到同样的问题。 我发现这个解决方案可行,似乎不会产生其他问题。

this.session.getBasicRemote().sendObject(message);

不要使用

this.session.getAsyncRemote().sendObject(message);

显然,这是Tomcat常见的问题,即WebSocket会话实例可以同时从不同的线程访问的方式。

synchronized(ep)
    {
        this.session.getAsyncRemote().sendObject(message);
    }

其中ep是一个静态对象,在我的经验中也没有起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接