Hatena::ブログ(Diary)

um registro de crescimento このページをアンテナに追加 RSSフィード

2006-10-05

[]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なので、以下のように設定


 <servlet>

  <servlet-name>testTask</servlet-name>

  <servlet-class>test.TaskStarter</servlet-class>

  <load-on-startup>3</load-on-startup>

 </servlet>




あとは、開始時間やら間隔やらを設定してOK。

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証