quartz定時任務
一、添加Maven依賴
<!-- 定時任務 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
二、創建執行任務的任務類
如下所示:創建了TestJob01並實現了Job,該任務只是簡單的打印當前時間
package cn.wh.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Date; /** * 定時執行任務的任務類-測試 * @author wanghao * */ public class TestJob01 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println("任務打印"+sdf.format(new Date())); } }
三、創建調用任務的調度類
package cn.wh.scheduler; import cn.wh.job.TestJob01; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; /** * 任務調度類 */ public class TestJob01Scheduler { //創建調度器 public static Scheduler getScheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); return schedulerFactory.getScheduler(); } // 執行任務 public static void run() throws SchedulerException{ //創建任務 JobDetail jobDetail = JobBuilder.newJob(TestJob01.class).withIdentity("testJob01", "group11").build(); //創建觸發器 每5秒鍾執行一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group21") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()) .build(); Scheduler scheduler = getScheduler(); //將任務及其觸發器放入調度器 scheduler.scheduleJob(jobDetail, trigger); //調度器開始調度任務 // 啟動 if (!scheduler.isShutdown()) { scheduler.start(); } } public static void main(String[] args) throws SchedulerException { TestJob01Scheduler testJob01Scheduler = new TestJob01Scheduler(); testJob01Scheduler.run(); } }
執行結果如下圖所示:每隔五秒執行一次

執行過程如下圖:

使用Cron表達式,執行定時任務
Cron表達式包含6個必要組件和一個可選組件,如下表所示。
| 位置 |
含義 |
允許的特殊字符 |
| 1 |
秒(0~59) |
, - * / |
| 2 |
分(0~59) |
, - * / |
| 3 |
小時(0~24) |
, - * / |
| 4 |
日期(1~31) |
, - * / ? L W C |
| 5 |
月(JAN~DEC或1~12) |
, - * / |
| 6 |
星期(SUN~SAT或1~7) |
, - * / ? L C # |
| 7 |
年(可選,1970~2099),若為空,表示全部時間范圍 |
, - * / |
| 特殊字符 |
說明 |
| * |
通配符,任意值 |
| ? |
無特定值。通常和其他指定的值一起使用,表示必須顯示該值但不能檢查 |
| - |
范圍。e.g.小時部分10-12表示10:00,11:00, 12:00 |
| , |
列分隔符。可以讓你指定一系列的值。e.g.在星期域中指定MON、TUE和WED |
| / |
增量。表示一個值的增量,e.g.分鍾域中0/1表示從0開始,每次增加1min |
| L |
表示Last。它在日期和星期域中表示有所不同。在日期域中,表示這個月的最后一天,而在星期域中,它永遠是7(星期六)。當你希望使用星期中某一天時,L字符非常有用。e.g.星期域中6L表示每一個月的最后一個星期五 |
| W |
在本月內離當天最近的工作日觸發,所謂的最近工作日,即當天到工作日的前后最短距離,如果當天即為工作日,則距離是0;所謂本月內指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天確實滿足最近工作日。e.g. LW表示本月的最后一個工作日觸發,W強烈依賴月份。 |
| # |
表示該月的第幾個星期,e.g. 1#2表示每一個月的第一個星期一 |
| C |
日歷值。日期值是根據一個給定的日歷計算出來的。在日期域中給定一個20C將在20日(日歷包括20日)或20日后日歷中包含的第一天(不包括20日)激活觸發器。例如在一個星期域中使用6C表示日歷中星期五(日歷包括星期五)或者第一天(日歷不包括星期五) |
代碼如下:
package cn.wh.utils; import cn.wh.job.TestJob01; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; public class QuartzManager { private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME"; private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME"; /** * 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名 * @param jobName 任務名 * @param cls 任務 * @param time 時間設置 */ public static void addJob(String jobName, Class cls, String time) { try { // org.quartz-scheduler Scheduler sched = gSchedulerFactory.getScheduler(); // 任務名,任務組,任務執行類 //創建任務 JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, TRIGGER_GROUP_NAME).build(); //可以傳遞參數 jobDetail.getJobDataMap().put("param", "railsboy"); // 觸發器 //每秒鍾觸發一次任務 CronTrigger trigger = TriggerBuilder.newTrigger(). withIdentity(jobName, TRIGGER_GROUP_NAME). withSchedule(CronScheduleBuilder.cronSchedule("*/3 * * * * ? *")). build(); // 觸發器時間設定 sched.scheduleJob(jobDetail, trigger); // 啟動 if (!sched.isShutdown()) { sched.start(); } } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { QuartzManager.addJob("Test01",TestJob01.class,""); } }
可以看到任務每三秒執行一次。

