gpt4 book ai didi

java - websocket 发送期间 ByteBuffer 中的 IllegalArgumentException

转载 作者:行者123 更新时间:2023-11-28 23:12:07 46 4
gpt4 key购买 nike

我有一个相当复杂的基于 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)

抛出此异常后,网络套接字将保留在 PARTIAL_WRITING 状态并在下一次写入尝试时断开连接。

我看到它在启动 Tomcat 后 15 分钟发生,我也看到它在服务器上闲置 8 小时后发生。我找不到与用户在服务器上执行的操作以及何时抛出此异常有任何关联。

问题似乎发生在 Spring/Java NIO 代码的深处,我不确定如何调试它。

如有任何帮助,我们将不胜感激!

最佳答案

在从其他人那里阅读了一些稍微相关的问题后,我在黑暗中试了一下,我没有将字节缓冲区传递给客户端线程来发送它,而是为每个要发送它的线程制作了字节缓冲区的完整副本。

我也从使用 websocket.sendBinary(ByteBuffer bb) 切换到使用 websocket.sendBinary(byte[] bb)。

这似乎已经成功了,因为我没有看到这个错误在生产模式下以非常重的负载运行服务器 12 小时后再次发生。如果我找到有关此的更多信息,我将在此处更新。

关于java - websocket 发送期间 ByteBuffer 中的 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56610028/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com