首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一旦队列填满,WebSocket异步发送可能会导致阻止发送

一旦队列填满,WebSocket异步发送可能会导致阻止发送
EN

Stack Overflow用户
提问于 2014-10-09 03:03:41
回答 1查看 9.4K关注 0票数 5

我有一个非常简单的基于Jetty的websockets服务器,负责将小的二进制消息流式传输到连接客户端。

为了避免在服务器端出现任何阻塞,我使用了sendBytesByFuture方法。

在将负载从2个客户端增加到20个之后,它们停止接收任何数据。在故障排除过程中,我决定打开同步发送方法,最终得到了潜在的原因:

代码语言:javascript
运行
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-09 03:35:36

如果错误消息来自同步发送,那么您有多个线程试图在同一RemoteEndpoint上发送消息-这是协议所不允许的。一次只能发送一条消息。(同步发送基本上没有队列)

如果错误消息来自异步发送,则意味着您的消息在队列中等待发送,但您仍在尝试写入更多的异步消息。

尽量不要同时混用同步和异步(很容易意外导致输出变成无效的协议流)

使用Java Futures的

您将希望使用sendBytesByFuture()sendStringByFuture()方法返回时提供的Future对象来验证消息是否已实际发送(可能是错误),如果有足够多的开始排队未发送,您将停止发送更多消息,直到远程端点可以赶上。

这里适用标准的Future行为和技术。

使用Jetty回调的

sendBytes(ByteBuffer,WriteCallback)sendString(String,WriteCallback)方法中还提供了WriteCallback行为,可以在成功/错误时调用您自己的代码,您可以在发送内容周围添加一些逻辑(限制发送、减慢发送、排队、过滤、丢弃一些消息、确定消息的优先级,等等)

使用阻塞的

或者,您可以只使用阻塞发送,这样就不会有太多消息排队。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26264508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档