我有一个非常简单的基于Jetty的websockets服务器,负责将小的二进制消息流式传输到连接客户端。
为了避免在服务器端出现任何阻塞,我使用了sendBytesByFuture方法。
在将负载从2个客户端增加到20个之后,它们停止接收任何数据。在故障排除过程中,我决定打开同步发送方法,最终得到了潜在的原因:
java.lang.IllegalStateException: Blocking message pending 10000 for BLOCKING
at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.lockMsg(WebSocketRemoteEndpoint.java:130)
at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.sendBytes(WebSocketRemoteEndpoint.java:244)
客户端在收到数据时不做任何计算,因此他们可能不会是慢连接者。
所以我想知道我能做些什么来解决这个问题?(使用Jetty 9.2.3)
发布于 2014-10-09 03:35:36
如果错误消息来自同步发送,那么您有多个线程试图在同一RemoteEndpoint
上发送消息-这是协议所不允许的。一次只能发送一条消息。(同步发送基本上没有队列)
如果错误消息来自异步发送,则意味着您的消息在队列中等待发送,但您仍在尝试写入更多的异步消息。
尽量不要同时混用同步和异步(很容易意外导致输出变成无效的协议流)
使用Java Futures的:
您将希望使用sendBytesByFuture()
和sendStringByFuture()
方法返回时提供的Future
对象来验证消息是否已实际发送(可能是错误),如果有足够多的开始排队未发送,您将停止发送更多消息,直到远程端点可以赶上。
这里适用标准的Future
行为和技术。
使用Jetty回调的:
sendBytes(ByteBuffer,WriteCallback)
和sendString(String,WriteCallback)
方法中还提供了WriteCallback
行为,可以在成功/错误时调用您自己的代码,您可以在发送内容周围添加一些逻辑(限制发送、减慢发送、排队、过滤、丢弃一些消息、确定消息的优先级,等等)
使用阻塞的:
或者,您可以只使用阻塞发送,这样就不会有太多消息排队。
https://stackoverflow.com/questions/26264508
复制相似问题