2014年11月08日

23. サーブレット/Webサービスの(スレッドの)多重実行を抑止する処理について

23. サーブレット/Webサービスの(スレッドの)多重実行を抑止する処理について

バッチ処理をWebサービスで実装する場合(基本、crond経由のwgetで起動するが、WebUIからも起動できるので何かと便利)など、サーブレット/Webサービスの(スレッドの)多重実行を抑止する場合は、基底クラスの初期処理で上記の処理を一元化し、別途定義した(仮称)SingleThreadServletインターフェース/(仮称)SingleThreadServiceインターフェース(実装なし)を該当するサーブレットクラス、Webサービスクラスにimplementsさせる方針とすること。

例)
final private static Hashtable lockTable = new Hashtable();

synchronized private static boolean lock(Class webServiceClass) {
    if (!lockTable.containsKey(webServiceClass)) {
        lockTable.put(webServiceClass, "");
        return true;
    }
    return false;
}

private static void unlock(Class webServiceClass) {
    lockTable.remove(webServiceClass);
}

初期処理内:
if (this instanceof SingleThreadService && !lock(this.getClass())) {
    // 異常処理
} else {
    // 正常処理
}

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

メールアドレス:

ホームページアドレス:

コメント:

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

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