什麼是Quartz
- Quartz是一個完全由java編寫的開源作業調度框架。Quartz是功能強大的開源作業調度庫,幾乎可以集成到任何Java應用程序中-從最小的獨立應用程序到最大的電子商務系統。Quartz可用於創建簡單或複雜的計劃,以執行數以萬計,數以萬計的工作。任務定義爲標準Java組件的作業,它們實際上可以執行您可以對其執行的任何編程操作。Quartz Scheduler包含許多企業級功能,例如對JTA事務和集羣的支持。
Quartz相對於Timer的優勢
- Timer定時器沒有持久化機制。
- Timer定時器的日程管理不夠靈活(只能設置開始時間、重複的間隔,設置特定的日期、時間等)
- Timer定時器沒有使用線程池(每個Java定時器使用一個線程)
- Timer定時器沒有切實的管理方案,你不得不自己完成存儲、組織、恢復任務的措施
Quartz及相關依賴
Quartz jar包:https://repo1.maven.org/maven2/org/quartz-scheduler/quartz/2.3.0/quartz-2.3.0.jar
Quartz-jobs :https://repo1.maven.org/maven2/org/quartz-scheduler/quartz-jobs/2.3.0/quartz-jobs-2.3.0.jar
Quartz的簡單實現
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
public class QuartzTest {
public static void main(String[] args) {
try {
// Grab the Scheduler instance from the Factory
/**
* 一旦使用獲取了調度程序StdSchedulerFactory.getDefaultScheduler(),
* 您的應用程序將不會終止,直到您調用爲止scheduler.shutdown(),因爲將有活動線程。
*/
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
//定義作業並將其綁定到我們的HelloJob類
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
// 觸發作業以立即運行,然後每40秒重複一次
/*Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();*/
//使用是Cron表達式 執行定時任務,24h制,17:27執行 --- 0 27 17 * * ?
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 27 17 * * ?");
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(scheduleBuilder).build();
// 告訴scheduler使用我們的觸發器
scheduler.scheduleJob(job, trigger);
Thread.sleep(60000);//線程休眠60s,期間程序不會自動停止
scheduler.shutdown();
} catch (SchedulerException | InterruptedException se) {
se.printStackTrace();
}
}
}
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("具體定時業務實現");
}
}
Tip:一旦使用獲取了調度程序StdSchedulerFactory.getDefaultScheduler(),因爲有活動線程的存在,應用程序將不會終止,直到調用scheduler.shutdown()爲止。
定時任務中的Cron表達式
Cron表達式在線生成地址 :http://cron.qqe2.com/
字段 允許值 允許的特殊字符 秒
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” 每年三月的星期三的下午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” 每月的第三個星期五上午10:15觸發