2017-04-06 12 views
1

Jettyはwebsocket経由でメッセージを送信するにはorg.eclipse.jetty.websocket.common.BlockingWriteCallbackを使用します。クライアントが「遅い」場合、このブロック書き込みにハングが発生する可能性があります(例:https://github.com/eclipse/jetty.project/issues/272#issuecomment-290910610を参照してください)WebSocketによる非ブロック化の送信

私は、Jetty + Spring + SpringのWebsocket Clientを使用してスロークライアントの成功シミュレーションを行っています。

WebSocketメッセージを「送信して忘れる」ようにしたいので、クライアントが遅い(それが何をしようとしたとしても)、BrokerWriteCallbackの解決には影響しません。 Jetty(コンフィギュレーションまたはソースコードの編集)でそれを達成する最良の方法は何ですか?

現在、Jettyバージョン9.3.11.v20160721がSpring 4.3.3で使用されています。

答えて

1

桟橋には既にslow serverslow clientテストがあります。

無制限のバッファリングを意味するので、「送信して忘れる」というようなものはありません。

はオプションを送る非ブロックがありますが、それは強くでは、ローカルエンドポイントが正常にそのメッセージを送った(またはしない)しているかどうかを知るためにFuturesまたはCallbacksに注意を払うことを奨励です。

ヒント:前回の処理がまだ成功していない場合は、別のメッセージをRemoteEndpointに送信しないでください(対処するネットワーク輻輳の決定があります)。 FuturesまたはCallbacks意志トリガメモリエラー(OOM)に注意を払うために

失敗。文字列(フューチャーsendStringByFuture

  • 無効sendBytes(ByteBufferのデータ、WriteCallbackコールバック)
  • 今後sendBytesByFuture(ByteBufferのデータ)
  • 無効sendString(文字列のテキスト、WriteCallbackコールバック)
  • RemoteEndpointを参照してください。テキスト)

このすべてが圧倒的だと思われる場合は、websocketの上に構築された多数のライブラリのいずれかを使用して、このすべてを管理することを検討してください。

私はcometd.org

+0

ありがとうオープンソースプロジェクトを見てことをお勧めします!あなたはあなたの問題の詳細を教えていただけますか?コールバック付きのsendStringを想定します。クライアントがメッセージを受信したとき、または「ネットワークに書き込まれた」ときにクライアントからの何らかの確認なしでコールバックが返されるかどうか正直言って私はまだ低レベルのコミュニケーションがいかに正確に機能しているかは分かりませんし、これについての有用な洞察も高く評価しています。クライアントが "ハングする"(受信に失敗した)場合、スレッドはブロックされます。理想的には私のプログラムが他のクライアントにデータを送ることができるようにしたい。現在、私は特定の理由でシングルスレッド送信を使用しています(1つのスレッドのみがJettyを呼び出します) –

関連する問題