Javaを使った定時処理

通常Javaを使った定時処理を行うときは、
mainメソッドを実装したクラスを作成し、
サーバ機の定時処理(Windowsのbatや、Linuxのcronなど)で呼び出したりする。
・・・のしか思いつかなかった。


が、これだと、
現在作っているのが、たとえばウェブアプリケーションで、
なおかつ同じ機能や同じクラスを流用したい場合、
ウェブアプリで使っているjarファイルから、オリジナルのライブラリまで、
全てにクラスパスを通さなければならない。


まあ、当たり前といえば当たり前なのだが。


そこで、
ウェブアプリケーションに並行して使用する定時バッチとして、
定時処理をスタートさせるサーブレットを用意し、
それを、Tomcat起動時、すなわちアプリケーションを配置するのと同時に配置し、
サーバが機能している間は、ずっとスレッドを監視し続け、
指定時間になったら、処理を行う、というJavaを実装してみた。


思いのほか上手くいっているので満足。


以下、実装メモ。


1.スタートアップ用のサーブレットを用意
「init」メソッドを用意するのがポイント。

public class TaskStarter extends HttpServlet {

 private Task task = null;

 public void init(ServletConfig config) throws ServletException {
  //タスクを開始
  start();
 }

 private void start(){
  if(reportTask == null){
   reportTask = new ReportTask();
  }

  try {
   //*起動後は、規定時間ごとにスレッドを監視。
   Timer timer = new Timer(true);
   timer.schedule(task,0, 60000); //①60秒間ごとにtask処理を実施
  }catch (Throwable ex){
   //throw ex;
  }
 }
 
 (以下略)

2.処理クラスを作成
ちょっと端折ったけど、次のような感じ。
Starterでタスクを呼び出すときに、1分ごとに呼び出すように設定。
(①の処理。60000の数値を変えると監視間隔は変更可能)
1分ごとにタスククラスのrunメソッドが処理されるので、
そのメソッド内で、時間を監視し、規定の時間がきたら処理。

public class ReportTask extends Task{
 /**
  * コンストラク
  */
 public ReportTask(){

 }
  /**
  * タスク処理本体
  */
 public void run(){
  try{
   
   Date tryTimeStartMail = //今日の日付+指定時間
   Date tryTimeEndMail =  //↑の日付+トライ時間
   Date nowTime = now();

   //処理(開始時間から、一定時間内リトライを行う)
   if (nowTime.after(tryTimeStartMail) &&
     nowTime.before(tryTimeEndMail)){
    //一回成功したら次は処理しないように記述する

   }
   
  }catch (Throwable ex){

  }
 }


3.スターターを起動するようにweb.xmlに設定
ウェブアプリケーションのweb.xmlでOKなので、以下のように設定

 
  testTask
  test.TaskStarter
  3
 


あとは、開始時間やら間隔やらを設定してOK。
バッチにかかる処理時間などによって、トライ方法やトライ間隔などを考えないとダメだけど、実現方法としてこういうのもアリかなと。