Java WebSockets:远程端点处于状态
我正在尝试实现一些基于websockets的应用程序,它将与JS客户端密切沟通。
发送消息的代码非常原始:
synchronized (session) { if (session.isOpen()) { session.getBasicRemote().sendText(message); } }
对于罕见的发送,它工作正常,但当几个线程试图通过相同的会话(套接字)发送一些消息时,抛出下一个exception(请注意,它不是multithreading问题,因为代码块是通过会话同步的):
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)
谷歌目前并没有这种类型的例外,在这个问题上打了几个小时后,仍然没有解决方案。
Java 7.0.21,在Tomcat 7.0.52和Tomcat 8.0.3上测试。
任何答案都非常感谢! 提前致谢。
更新3/11/2014:我使用Jetty 9.1测试了我的应用程序,但没有发生此exception。 我假设这是Tomcat实现错误。
好吧,这不是Tomcat问题,而是我的错。
我的onMessage函数返回了一个字符串,这意味着我回复了该消息。 结果,这些代码部分未同步。
坏:
@OnMessage public String onMessage(String message, Session session) { ... return message; }
好:
@OnMessage public void onMessage(String message, Session session) { ... }
我发现了这个: https : //bz.apache.org/bugzilla/show_bug.cgi?id = 56026
似乎tomcat做了一些意外的事情,作为一种解决方法,你必须同步所有session.sendxxx调用,无论它是否异步。