JavaタスクスケジューリングフレームワークQuartzチュートリアルの例
紹介する
Quartz is a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs;
Quartzフレームワークは、ほとんどのjavaアプリケーションを統合できるフル機能、オープンソースのタスクスケジューリングサービスです.小さなチップマシンシステムから大規模な電子商取引システムまでです.Quartzは何千ものタスクスケジューリングを実行することができます.
コアコンセプト
Quartzコアの概念
:schedulerタスクスケジュール、Jobタスク、Triggerトリガ、JobDetailタスク詳細
Jobタスク:実はJobはインタフェースで、executeメソッドは1つしかありません.
package org.quartz;
public abstract interface Job
{
public abstract void execute(JobExecutionContext paramJobExecutionContext)
throws JobExecutionException;
}
我々開発者は,このインタフェースを実装し,executeメソッドを実装すればよい.私たちがやりたいことをexecuteで実行すればいいです.
JobDetail:タスクの詳細、QuartzがJobを実行する場合、新しいJobインスタンスを作成する必要がありますが、Jobクラスを直接操作することはできませんので、JobDetailでJobの名前、説明情報を取得します.
Triggerトリガ:タスクを実行するルール;例えば毎日、毎時間などです.
一般的にSimpleTriggerとCronTriggerを使用し、このトリガはTriggerインタフェースを実現します.
複雑な時間表現では、例えば毎月15日午前何時何分か、CronTriggerを使用します.
単純な時間では、たとえば毎日何回か実行し、SimpleTriggerを使用します.
schedulerタスクスケジューリング:最も核心的な概念であり、JobDetailとTriggerをschedulerに登録する必要があります.
具体的な手順:
対応するjarパッケージをダウンロードします.http://www.quartz-scheduler.org/
注意:
異なるバージョンのjarパッケージは、具体的な操作はあまり同じではありませんが、考え方は同じです.たとえば1.8.6 jarパッケージでは、JobDetailはクラスであり、構築方法によって直接Jobクラスに関連付けられています.SimpleTriggerとCornTriggerはクラスです.2.0.2 jarパッケージでは、JobDetailはインタフェースであり、SimpleTriggerとCornTriggerはインタフェースである
異なるバージョンのテスト:
1.8.6 jarパッケージ:
package com.test;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
*
* @author lhy
*
*/
public class MyJob implements Job {
@Override
// , execute
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println(" Quartz"+new Date());
}
}
SimpleTriggerトリガの使用package com.test;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* @author lhy
*
*/
public class SchedulerTest {
public static void main(String[] args) {
// schedulerFactory
SchedulerFactory schedulerfactory=new StdSchedulerFactory();
Scheduler scheduler=null;
try{
// schedulerFactory
scheduler=schedulerfactory.getScheduler();
// jobDetail , Job
// job , , job
JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);
// , 1 , 8
SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");
//
simpleTrigger.setStartTime(new Date());
//
simpleTrigger.setRepeatInterval(1000);
//
simpleTrigger.setRepeatCount(8);
//
scheduler.scheduleJob(jobDetail, simpleTrigger);
//
scheduler.start();
}catch(SchedulerException e){
e.printStackTrace();
}
}
}
CornTriggerトリガを使用する場合: package com.test;
import java.util.Date;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* @author lhy
*
*/
public class CronTriggerTest {
public static void main(String[] args) {
// schedulerFactory
SchedulerFactory schedulerfactory=new StdSchedulerFactory();
Scheduler scheduler=null;
try{
// schedulerFactory
scheduler=schedulerfactory.getScheduler();
// jobDetail , Job
// job , , job
JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);
// , 10:15
CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");
//
cornTrigger.setCronExpression("0 15 10 * * ? *");
//
scheduler.scheduleJob(jobDetail, cornTrigger);
//
scheduler.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
2.0.2 jarパッケージでは、次のようになります.そのうちjobクラスは変わらず、主にスケジューリングクラスは以下の通りです.
package com.test;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* @author lhy
*
*/
public class SchedulerTest {
public static void main(String[] args) {
// schedulerFactory
SchedulerFactory schedulerfactory=new StdSchedulerFactory();
Scheduler scheduler=null;
try{
// schedulerFactory
scheduler=schedulerfactory.getScheduler();
// jobDetail , Job
// job , , job
JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();
//
// simpleTrigger
// Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")
// .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))
// .startNow().build();
// cornTrigger 10 42
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))
.startNow().build();
//
scheduler.scheduleJob(job, trigger);
//
scheduler.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
上記demoダウンロード:1.8バージョンdemoダウンロード2.0バージョンdemoダウンロード
CornExpressの説明は次のとおりです.
フィールド 許容値 許可される特殊文字
秒 0-59 , - */
分 0-59 , - */
時間 0-23 , - */
日付 1-31 , - * ?/L W C
月 1-12またはJAN-DEC , - */
曜日 1-7またはSUN-SAT , - * ?/L C#
年(オプション) 空けて、1970-2099 , - */
式#シキ# 意味
"0 0 12 * * ?" 毎日昼12時にトリガーされます
"0 15 10 ? * *" 毎日午前10時15分にトリガーされます
"0 15 10 * * ?" 毎日午前10時15分にトリガーされます
"0 15 10 * * ? *" 毎日午前10時15分にトリガーされます
"0 15 10 * * ? 2005" 2005年の毎日午前10時15分にトリガー
"0 * 14 * * ?" 毎日午後2時から午後2時59分までの間に1分ごとにトリガーされます
"0 0/5 14 * * ?" 毎日午後2時から午後2時55分までの5分間にトリガーされます
"0 0/5 14,18 * * ?" 毎日午後2時から2時55分、午後6時から6時55分までの5分間にトリガーされます.
"0 0-5 14 * * ?" 毎日午後2時から午後2時05分までの1分ごとにトリガーされます
"0 10,44 14 ? 3 WED" 毎年3月の水曜日の午後2時10分と2時44分にトリガーされます
"0 15 10 ? * MON-FRI" 月曜日から金曜日の午前10時15分にトリガーされます
"0 15 10 15 * ?" 毎月15日午前10時15分にトリガーされます
"0 15 10 L * ?" 毎月最終日の午前10時15分にトリガーされます
"0 15 10 ? * 6L" 毎月の最後の金曜日の午前10時15分にトリガーされます
"0 15 10 ? * 6L 2002-2005" 2002年から2005年までの毎月の最後の金曜日の午前10時15分にトリガーされました
"0 15 10 ? * 6#3" 毎月の第3金曜日午前10時15分にトリガーされます
特殊文字 意味
* すべての値を表します.
? 説明されていない値を表します.つまり、その値に関心がありません.
- 指定した範囲を表す.
, 可能な値を付加することを表す.
/ 記号の前は開始時間を表し、記号の後は毎回増加する値を表す.
L("last") (last)「L」はday-of-monthフィールドで「今月の最後の日」を意味します.day-of-weekフィールドでは、「7」or「SAT」を簡単に意味します.day-of-weekフィールドで数字と組み合わせて使用すると、「今月の最後の曜日」を意味します.たとえば、「6 L」means「今月の最後の金曜日」です.「L」を使用する場合は、リスト値や範囲を指定しないことが重要です.そうしないと、予想外の結果が得られます.
W("weekday") day-of-monthフィールドでのみ使用できます.指定日に最も近い平日(月曜日から金曜日)を描くために使用されます.例えば、day-of-monthフィールドで「15 W」とは、「今月15日目に最も近い平日」を指します.つまり、今月15日目が土曜日であれば、トリガは今月14日目、金曜日にトリガーされます.今月15日目が日曜日であれば、トリガは今月16日目の月曜日にトリガーされます.今月15日目が火曜日であれば、トリガの日にトリガーされます.注意:この使い方は現在の月でのみ計算され、現在の月を越えません.「W」文字はday-of-monthで1日のみ指定でき、範囲またはリストではありません.「LW」で今月の最終日を指定することもできます.
# day-of-weekフィールドでのみ使用できます.今月の何週目かを指定します.例:day-of-weekフィールドでは「6#3」で今月第3金曜日(6は金曜日、3は第3金曜日)を指す.指定した日付が存在しない場合、トリガはトリガーされません.
C calendarに連絡して計算した値を指します.例:day-of-monthフィールドで「5 C」とは、今月5日目以降にcalendarを含む初日を指す.day-of-weekフィールドで「1 C」とは、今週の日曜日以降にcalendarを含む初日を指す