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