(続々)Webスレッドをタイムアウトさせる方法
一般的なサーブレットコンテナには、考えているような機能は無いので、なんとかできないものかと、以下のようなビジネスロジックのサンプルコードを書いてみた。こうすれば、後々、Timer処理の部分をAdviceとして括り出し、AOPでウィーブすることで、どこにでもタイムアウトの処理を挿入できるかな〜と期待に胸を膨らませたのだが..
//タイムアウトしたら異常終了するビジネスロジック public void ExpectationTimeOut() Throws IOException, SerlvetException { Timer timer = new Timer(); timer.schedule(new TimerTask(){ public void run(){ //ここにタイムアウトした時に必要な処理を書く 〜 throw new RuntimeException(); //最後に例外投げる } }, 1000); // 1秒経過したらタイムアウト(例) //ここにビジネスロジックを書く //(恣意的にタイムアウトさせるには1秒以上かかる処理が必要) 〜 //処理が無事終了したらタイマーをキャンセルする timer.cancel(); }
このロジックをサーブレットコンテナから呼ぶようにして、実際に起動してみた所、見事に例外は上がってくれたのだが、当然ながらその例外はコンテナに伝わらないので処理は中断されない。例外を外側(コンテナ)に伝搬できるような作りが必要なわけで、やっぱTimerとTimerTaskじゃ駄目か。
追記:通常のTimerTaskじゃだめなら、他のを考えてみようか。