2016-08-05 13 views
0

私は1.1.0をClojureで使用してwebsocketクライアントを作成しています。HashedWheelTimerインスタンスが多すぎます

  • は数秒で始まり、同期、前を閉じ分
  • コードについてで終わる待ち時間の増加に伴って、切断に接続を再接続:私のコードは、ロジックの追加数行で、example websocket clientほとんど正確ですwebSocketが存在し、開いている場合

私の問題は、これを数日から1週間実行した後、コンソールにこのエラーメッセージが表示されることです。私のロギングやアプリケーションの何かによって出力されず、最初に私はそれが再接続するようにリンクされていると思っていましたが、数時間前または後に再接続がないときにもそれを取得します。

Jul 24, 2016 6:48:18 AM org.jboss.netty.util.internal.SharedResourceMisuseDetector 
WARNING: You are creating too many HashedWheelTimer instances. HashedWheelTimer is a shared resource that must be reused across the application, so that only a few instances are created. 

これは、網状のSharedResourceMisuseDetectorAsynchronous Http Client for Javaで使用によってトリガーされるようです。これは、HashedWheelTimerのインスタンスが256を超える場合に発生します。私はHashedWheelTimerが1つだけであるべきことがすべて指摘されたときに、HashedWheelTimerの多くのインスタンスが何を作成するのかを理解しようとしています。これは、何かがそれ自身の後で適切にクリーンアップしないように見えます。誰もHashedWheelTimersを正確に作成する方法とそれを防ぐ方法を知っていますか?

+0

私にとって再接続論理が最初に見えるでしょう。あなたがそれらを質問に貼り付けることができれば、質問をはるかに簡単に答えることができます。ループ/再帰のようなものがあるかもしれません(間違った場所に接続の作成が含まれているか、または再接続が古い接続への参照を保持しています)。私はいくつかのコードを見ずにしか推測できません。コードもこの問題をあなたの変更なしで(無限のスピンループをもっと妥当なものに変更することを除いて) –

+0

再接続コードはかなりシンプルで、このように機能します:切断時には、将来的に少し待ってからconnect関数を呼び出しますConnect関数は、以前のクライアントが格納されているアトムをチェックし、存在していればそれを閉じて新しい接続を開きます(client/close @ current-client)、次に(client/websocket(サンプルコードと私のコードは同じで、スピン関数を除いて、さらに処理するいくつかのロジックを加えたものです(例:client/create-client)url:open on:close on:close:そのデータはワイヤを通ってきます( Nettyを使用します)。 – Domchi

答えて

0

私は犯人を見つけたと信じています。

すると、私は、各再接続のために何をやっていたことは次のとおりです。

(client/websocket (client/create-client) url ...) 

...または他の言葉では、毎回新しいクライアントを作成します。すべての新しいクライアントが独自のHashedWheelTimerをインスタンス化するようです。だから私はただ1つのクライアントをインスタンス化し、それを再利用し、それは問題を修正したようです。

関連する問題