0

Web アプリケーションの開発中に、Jetty の WebSocket 接続管理のバグと思われるものに遭遇しました。誰かがこの問題に遭遇するという不運に見舞われたかどうか、もしそうなら、彼らはどのようにこの問題を回避したか、または回避したか疑問に思っています.

私が経験している問題は、次の 3 つの部分にあります。

  1. Jetty はクライアントの WebSocket が閉じていることを認識しません (onClose イベントを取得せず、WebSocketConnection.isConnected() は true を返します)。毎秒クライアントに ping を実行していますが、最初の ping のみが失敗することに注意してください。最初の ping の後の他の ping は結果 (失敗または成功) を返しません。

  2. クライアントが実際に閉じた時点からのすべてのメッセージが蓄積され、接続が切断されてから 5 分後まで失敗せず、保留中のすべてのメッセージが java.nio.channels.InterruptedByTimeoutException でコンソールにダンプされます。

  3. これらの (失敗した) 保留中のメッセージはクリアされません。切断されたクライアントに送信されるすべてのメッセージは、Jetty サーバーが取得した WebSocket 接続ごとに、5 分ごとに InterruptedByTimeoutException をダンプします。

短期的には、サーバーは引き続き新しい接続を受け入れることができ、アプリケーションはまだぐったりする可能性があります。ただし、ご想像のとおり、これらのメッセージが十分に蓄積されると、すべてのタイムアウトを報告するスレッドが実行時間を消費し、HTTP、WebSocket などの新しい接続が受け入れられなくなります。

私は主に Jetty 9.0.0.M2 でこれをテストしましたが、9.0.0.M3 にも同じ問題があるようです。興味のある方のために、再現するための具体的な手順を次に示します。

  1. Jetty 9 サーバーへの WebSocket 接続を作成する Web ページを開きます。(私の WebSocket が WebWorker 内から開かれていることを指摘することは、関連する場合と関連しない場合があります)。
  2. Jetty が接続を認識したら、Jetty から 1 秒ごとにクライアントへの ping を開始し、結果をログに記録します。
  3. クライアント WebSocket ページが実行されているタブまたはブラウザーを閉じます。
  4. ping が 1 回だけ失敗することを確認します。それ以降の ping は、成功または失敗をログに記録しません。また、onClose イベントが発生しないことにも注意してください。
  5. 5 分間待ってから、Jetty コンソールが爆発し、終了していないすべての ping またはメッセージに対して次の例外が表示されるのを確認します。

2013-01-12 19:39:52.747:WARN:oejwci.FrameBytes:Timer-3: 失敗 (null) java.nio.channels.InterruptedByTimeoutException org.eclipse.jetty.util.thread.TimerScheduler$SimpleTask.run(TimerScheduler .java:88) java.util.TimerThread.mainLoop (不明なソース) で java.util.TimerThread.run (不明なソース)

4

0 に答える 0