我正在尝试实现一些基于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实现错误。
好的,这不是Tomcat问题,而是我的错。
我的onMessage函数返回了一个字符串,这意味着我回显了消息。结果,这部分代码没有同步。
坏:
@OnMessage public String onMessage(String message, Session session) { ... return message; }
好:
@OnMessage public void onMessage(String message, Session session) { ... }