我有一个基于websocket的相当复杂的应用程序,它在最新的Tomcat 8服务器上运行。
在相当随机的时间间隔内,我会同时在所有已连接的用户上得到此例外。
java.lang.IllegalArgumentException
at java.nio.Buffer.limit(Buffer.java:275)
at org.apache.tomcat.websocket.PerMessageDeflate.sendMessagePart(PerMessageDeflate.java:377)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:284)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:258)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialBytes(WsRemoteEndpointImplBase.java:161)
at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendBinary(WsRemoteEndpointBasic.java:56)
at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendBinaryMessage(StandardWebSocketSession.java:202)
at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105)
at org.infpls.royale.server.game.session.RoyaleSession.sendImmiediate(RoyaleSession.java:69)
at org.infpls.royale.server.game.session.SessionThread.run(SessionThread.java:46)
引发此异常后,Web套接字将保持在PARTIAL_WRITING状态,并在下次写入尝试时断开连接。
我已经看到它是在启动Tomcat 15分钟后发生的,而我已经看到它在服务器上闲置8小时后才发生。我找不到与用户在服务器上执行的操作以及何时引发此异常的任何关联。
这个问题似乎已经深入到Spring / Java NIO代码中了,我不确定如何调试它。
任何帮助将不胜感激!
答案 0 :(得分:0)
在阅读了其他人的一些稍微相关的问题之后,我在黑暗中开了枪,而不是将字节缓冲区传递给客户端线程以发送它,而是为将发送字节缓冲区的每个线程制作了完整的副本。
我也从使用websocket.sendBinary(ByteBuffer bb)切换为使用websocket.sendBinary(byte [] bb)。
这似乎已经解决了问题,因为我没有看到在生产模式下以非常重的负载运行服务器12小时后再次发生此错误。如果我发现有关此问题的更多信息,请在此处进行更新。