2017-04-06 183 views
1

Jetty使用org.eclipse.jetty.websocket.common.BlockingWriteCallback通过websocket发送消息。如果客户端是“慢”,那么这个阻塞写可能会遇到挂起(请参阅,例如这里https://github.com/eclipse/jetty.project/issues/272#issuecomment-290910610使WebSocket发送非阻塞

我有一个成功的慢客户端使用Jetty + Spring + Spring的Websocket客户端的模拟。

我想“发送和忘记”的WebSocket的消息,因此,如果客户端很慢(无论何种确认它试图这样做),这并不影响BrokerWriteCallback的分辨率。什么是实现与码头(配置或源代码编辑?)使用Spring 4.3.3使用

目前码头版本9.3.11.v20160721的最佳途径。

回答

1

码头有slow serverslow client测试了。

有作为“发送和忘记”没有这样的事,因为这意味着无限的缓冲。

有无阻塞发送选项,但它是强烈鼓励你留意FuturesCallbacks知道,如果本地端点已成功发送该消息(或没有)。

提示:如果前一个还没有成功(您有网络拥塞决定要处理),不要发送另一个消息到RemoteEndpoint。

若不注意FuturesCallbacks触发内存错误(OOM)。

RemoteEndpoint

如果所有这些看起来都很令人难以置信,那么可以考虑使用构建在websocket之上的众多库中的一个来管理所有这些。

我鼓励大家看看这个开源项目cometd.org

+0

谢谢!你能否详细说明你的问题?假设我用一个回调sendString。当客户收到邮件时,或者当它被“写入网络”,但没有来自客户端的确认时,会进行回调吗?说实话,我还不知道底层沟通是如何运作的,并且也非常欣赏有用的见解。如果客户端“挂起”(无法接收),则线程被阻止。我希望理想的是我的程序能够将数据发送给其他客户端。目前我使用单线程发送出于某些原因(只有一个线程可以调用Jetty) –