Quartz框架
任務(Job):需要執行的具體工作
觸發器(Trigger):在特定的時間觸發任務的執行
調度器(Scheduler):任務的實際執行者,負責粘合任務和觸發器。
案例:
新建maven項目,添加Quartz依賴
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
新增任務明細類
package cn.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class RemindJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任務正在執行!");
}
}
測試類與cron表達式相關介紹,注意,觸發器有兩種創建方式,SimpleTrigger 與 CronTrigger
package cn.quartz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class TestMain {
public static void main(String[] args) throws Exception {
//創建任務
JobDetail jobDetail = new JobDetail("myJob","A",RemindJob.class);
//創建觸發器,指定固定時間間隔觸發器:SimpleTrigger,通過設置觸發器的屬性:開始時間、結束時間、重複次數、重複間隔等
//輪詢模式,每三秒執行一次
SimpleTrigger simpleTrigger =
new SimpleTrigger("mySimpleTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
//設置開始時間位當前時間的下一秒
simpleTrigger.setStartTime(new Date(System.currentTimeMillis()+1000));
//指定時間點的觸發器(比如每天凌晨3點執行一次):CronTrigger,實際開發中常用
//第三個參數,cron表達式,按位置分別表示爲
//秒 分 時 月份中的哪一天 月 星期幾 年
//按空格分隔,其中(月份中的哪一天)與(星期幾)表示任意值時可用 ‘?’或‘*’ 號,其他字段表示任意值用‘*’號
//除了可以設置某個固定值,還可以設置一個範圍(-)、一個列表(逗號間隔)、遞增(初始值/增量)如:
//"* 25-30 1 * * ?" :表示凌晨1點25分到30分的範圍執行
//"* 20,30,40 1 * * ?" :表示凌晨1點20分,30分,40分執行
//"* 10/5 1 * * ?" :表示凌晨1點10分開始,每5分鐘執行一次
//注意:(月份中的哪一天)與(星期幾)字段不能同時使用‘?’,也不能同時使用'*'號,年字段可以省略(至少保證表達式中存在6個字段)
//表示12時57分40秒執行
CronTrigger cronTrigger = new CronTrigger(",myCronTrigger", "B", "40 57 12 ? * *");
//創建調度器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//調度器綁定任務與觸發器
//scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.scheduleJob(jobDetail,cronTrigger);
//調度器執行任務
scheduler.start();
//模擬主線程睡20秒後觸發調度器停止
Thread.sleep(20000);
//調度器停止任務
scheduler.shutdown();
}
}
在與Spring整合的項目中,可在Controller層在任務方法上直接使用
@Scheduled(cron="0 0/10 * * * ?") 註解,就會定時執行該任務方法。
spring配置文件中需引入spring-task.xsd文件
在類中使用@Scheduled註解時,需要spring能掃到該類。