0

クライアント/ソケット接続をコーディングしており、ThreadPools を使用して複数のクライアントを処理しています。

サーバーが起動した後、いくつかのリソースが使用されています。f.ex.の場合、それらすべてを閉じたい:サーバーがクライアントにシャットダウンするように指示した場合、すべてを閉じたい。

私はまだ基​​本的なシャットダウン機能をコーディングしました:

public static void killClient() {
    try {
        threadpool.shutdown();
        in.close();//client input
        out.close();//client output
        socket.close();
    } catch(Exception e) {
        System.out.println("Client has been shutdown! " + e);
        e.printStackTrace();
    }
}

私の質問は:

すべてが適切に閉じられ、何も実行されていないことを確認するにはどうすればよいですか?

4

3 に答える 3

1

Java7を使用している場合は、Socket、Connection、Statementなどtry-with-resourcesのすべての閉じることができるオブジェクトの構成を利用して、スコープから外れると自動的に閉じることができます。

于 2012-10-17T16:16:29.800 に答える
1

すべてが適切に閉じられ、まだ何も実行されていないことを確認するにはどうすればよいですか?

以下の具体的な質問に答えました。

リソースを閉じることに集中するよりも、クラスを「閉じる」ことがより重要だと思います。クラス(Client上記のクラスなど)がスレッドプールやソケットなどのリソースをラップする場合は、そのクラスにclose()メソッド(上記のクラスなど)が必要killClient()です。サーバーがクライアントをフォークする場合は、server.close()呼び出しがさまざまなclient.killClient()メソッドを呼び出すようにクライアントを管理する必要があります。

あらゆる場所でブロックを使用して、さまざまなクラスを適切にシャットダウンすることに信心深い場合try {} finally {}は、閉じられていないリソースやハングしたスレッドについて心配する必要はありません。


これを行うのは困難であり、すべてのリソースタイプに包括的な答えはありません。ここに役立つかもしれないいくつかのアイデアがあります。

  • スレッドの場合、次のようなものを使用してThreads.getAllStackTraces()、残っているスレッドを表示できます。プログラムの開始時と終了時にこのリストを比較すると、残っているものを確認できるはずです。

  • ファイル記述子は非常に困難です。Linuxで実行している場合は、/proc/self/fdディレクトリを調べて、まだ開いている記述子を確認できます。もう一度開始と終了を比較します。OpenFileDescriptorCountアプリケーションでJMX変数( )を確認することもできjava.lang:type=OperatingSystemますが、これはコンテキストなしで記述子の数を示すだけです。

  • 他のリソースのリークを検出する簡単な方法はありません。ResourceManagerリソースを「生成」および「解放」する型クラスをそれらの周りにラップすることができますが、これにはプログラミングのサポートが必要です。マネージャの外部でリソースを作成する場合、リークを検出する簡単な方法はありません。

  • このようなメカニズムの一例は、ORMLiteテストで行うことです。ORMLiteは、多くのデータベース接続を開いたり閉じたりします。コードでそれらが出血していないことを確認したかったのです。データベース接続のラッパーを作成しました。このラッパーは、作成時にマネージャーに登録し、閉じたときに登録を解除します。その後、私はそれを確認することができassertTrue(connectionManager.isAllConnectionsClosed());ます。それが役に立ったかどうかはわかりません。

于 2012-10-17T16:17:33.690 に答える
1

in.close() が失敗した場合、コード内のすべての close() および shutdown() メソッドを別々の try ブロックに配置してください。 out.close() および socket.close() は決して呼び出されません。

また、メソッド killclient() が finally ブロック内から呼び出されていることを確認してください。

于 2012-10-17T16:19:52.253 に答える