2014年11月04日

6. HTTP(Hypertext Transfer Protocol)を利用した外部システム連携を行う処理について(2)

HTTP(Hypertext Transfer Protocol)を利用した外部システム連携を行う場合は、ファイルディスクリプタの枯渇を防止するため、必ずコネクションをクローズすること。

例)
Commons HttpClient 2.x:
method.setRequestHeader("Connection", "close");
method.releaseConnection();

Commons HttpClient 3.1:
method.setRequestHeader("Connection", "close");
method.releaseConnection();
if (httpClient.getHttpConnectionManager() instanceof SimpleHttpConnectionManager) {
    ((SimpleHttpConnectionManager)httpClient.getHttpConnectionManager()).shutdown();
}

Apache HttpComponents(HttpClient) 4.1/4.2:
method.setHeader("Connection", "close");
httpClient.getConnectionManager().shutdown();

通常、ネットワーク処理の内部では Socket を利用しており、その Socket(SocketImpl) が FileDescriptor を保持するため、コネクションをクローズしなければ Socket が残存し、 Socket が残存すれば FileDescriptor が残存することになり、ファイルディスクリプタが枯渇することになる。
また、ファイナライザが実行されれば Socket、FileDescriptor は解放されるが、ファイナライザの実行タイミングを意識することはできない。
なお、ファイルディスクリプタが枯渇した場合、
java.io.FileNotFoundException: /xxxxx/xxxxx.xxx (Too many open files)
が発生する。
また、
# netstat -a | grep CLOSE_WAIT
の実行結果を観察することで、コネクションのクローズ漏れを検知できる。

この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック