一尘不染

Java WebSockets:远程端点处于[TEXT_FULL_WRITING]状态

tomcat

我正在尝试实现一些基于websocket的应用程序,这些应用程序将与JS客户端进行非常密集的通信。

发送消息的代码非常原始:

synchronized (session) {
    if (session.isOpen()) {
        session.getBasicRemote().sendText(message);
    }
}

对于罕见的发送,它工作得很好,但是当少数线程试图通过同一会话(套接字)发送一些消息时,会抛出下一个异常(请注意,这不是多线程问题,因为代码块是通过会话同步的):

java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.checkState(WsRemoteEndpointImplBase.java:1015)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase$StateMachine.textStart(WsRemoteEndpointImplBase.java:978)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:161)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37)

Google目前尚不具备此类例外情况,并且在此问题上击败了几个小时之后,仍然没有解决方案。

Java 7.0.21,已在Tomcat 7.0.52和Tomcat 8.0.3上进行了测试。

任何答案都非常感谢!提前致谢。

2014年3月11日更新:我使用Jetty 9.1测试了我的应用程序,但没有发生此异常。我认为这是Tomcat实现错误。


阅读 2567

收藏
2020-06-16

共1个答案

一尘不染

好的,这不是Tomcat问题,而是我的错。

我的onMessage函数返回了一个字符串,这意味着我回显了消息。结果,这部分代码没有同步。

坏:

@OnMessage
public String onMessage(String message, Session session) {
   ...
   return message;
}

好:

@OnMessage
public void onMessage(String message, Session session) {
   ...
}
2020-06-16