JavaのHttpUpgradeHandlerのdestroyメソッドを徹底解説!初心者でもわかるリソース解放のタイミングと使い方
生徒
「先生、JavaのHttpUpgradeHandlerってアップグレード処理に使うって聞きましたけど、destroyメソッドは何のためにあるんですか?」
先生
「destroyメソッドは、アップグレードされた接続が終了したときに呼ばれて、使い終わったリソースを解放するために使いますよ。」
生徒
「なるほど、ちゃんと後片付けをする場所ってことですね!」
先生
「その通り!それでは、HttpUpgradeHandlerのdestroyメソッドについて詳しく見ていきましょう。」
1. destroyメソッドとは
Javaのjavax.servlet.http.HttpUpgradeHandlerインターフェースに含まれるdestroyメソッドは、HTTP接続がアップグレードされて利用されたあと、接続が終了したタイミングで呼び出されるメソッドです。
このメソッドの主な役割は、開いたリソース(ストリームやスレッドなど)を確実に閉じて、メモリリークや不具合を防ぐことです。
2. destroyメソッドのシグネチャ
destroyメソッドは引数も戻り値もない、非常にシンプルなメソッドです。
void destroy();
このメソッド内で必要なクリーンアップ処理をすべて行います。
3. destroyメソッドの基本実装
次は、アップグレード接続で使用していたスレッドを停止し、ログを出力するだけの基本的な実装例です。
import jakarta.servlet.http.HttpUpgradeHandler;
import jakarta.servlet.http.WebConnection;
import java.io.InputStream;
import java.io.OutputStream;
public class SimpleUpgradeHandler implements HttpUpgradeHandler {
private volatile boolean running = true;
@Override
public void init(WebConnection connection) {
new Thread(() -> {
try (InputStream in = connection.getInputStream();
OutputStream out = connection.getOutputStream()) {
int data;
while (running && (data = in.read()) != -1) {
out.write(data);
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
@Override
public void destroy() {
running = false;
System.out.println("接続終了。リソースを解放しました。");
}
}
4. destroyメソッドの主な用途
destroyメソッドは主に以下のような目的で使われます:
- スレッドの停止や割り込み
- 入出力ストリームのクローズ
- ファイルハンドルの解放
- データベースやネットワークリソースの切断
- ログ出力による監査
このメソッドを実装しておかないと、アップグレード通信が終わってもメモリが解放されず、システム全体のパフォーマンスに悪影響を与える恐れがあります。
5. Servletとの連携でdestroyが呼ばれるタイミング
HttpServletRequestでupgradeメソッドを使ってHttpUpgradeHandlerを指定すると、接続が切れた際にServletコンテナによってdestroyが自動的に呼び出されます。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
request.upgrade(SimpleUpgradeHandler.class); // 接続終了時にdestroyが呼ばれる
} catch (IOException e) {
e.printStackTrace();
}
}
6. destroyでのエラーハンドリングの注意点
destroyメソッド内で例外が発生すると、予期しない挙動になる可能性があります。そのため、try-catchで囲むことを忘れず、安全な終了処理を徹底しましょう。
また、サーバーによってはdestroyが呼ばれないケース(異常終了や強制終了)もあるため、バックグラウンド処理のタイムアウトやフェイルセーフ設計も重要です。
7. destroyはServletのdestroyとは別物
Servletにもdestroyというメソッドがありますが、これはServletそのものが破棄されるときの処理です。今回のHttpUpgradeHandlerのdestroyは、アップグレードされた接続の終了時専用なので混同しないようにしましょう。