【发布时间】:2014-03-07 17:44:54
【问题描述】:
我正在尝试实现一些基于 websockets 的应用程序,它将与 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 行为:bz.apache.org/bugzilla/show_bug.cgi?id=56026
标签: java tomcat websocket jsr356