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调用,无论它是否异步。