參考 https://www.imooc.com/video/15144
1.設計模式
builder模式、Factory模式、組件模式、鏈式寫法
2.三個核心概念
(1)調度器
(2)任務
(3)觸發器
3.體系結構
(1)JobDetail:包含任務的實現類以及類的信息
(2)trigger:決定任務器什麼時候被調用
分爲SimpleTrigger(類似timer的作用,例如在一個指定的時間段內執行一次作業任務或在指定的時間間隔內多次執行);
CornTrigger(基於日曆的作業調度器,例如每天執行一次);
//創建一個Trigger實例,定義該Job立即執行,並且每5秒執行一下,不斷重複下去 CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity( "myTrigger","group1" ).startNow().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
Scheduler(調度器)
(3)Job(定義執行任務)
4.第一個quartz程序
maven引入
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
新建HelliJob類
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.print("當前時間: "+simpleDateFormat.format(new Date()));
System.out.print("Hello Word!");
}
}
新建定時器類
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException{
//創建一個JobDetail實例,與Hello.calss綁定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(
"myJob","group1"
).build();
//創建一個Trigger實例,定義該Job立即執行,並且每5秒執行一下,不斷重複下去
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
"myTrigger","group1"
).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
//創建Scheduler實例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
//打印當前時間
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.print("當前定時時間: "+simpleDateFormat.format(new Date()));
}
}
5.JobDataMap
(1)在進行任務調度時JobDataMap存儲在JobExecutionContext中,方便獲取
(2)JobDataMap可以用來裝載任何可序列化的數據對象,當job實例對象被執行時這些參數
對象會傳遞給它
(3)JobDataMap實現了JDK的Map接口,並添加了一些方法用來存取基本數據類型
(4)獲取JobDataMap的兩種方式
第一種 : 在 HelloScheduler中
//創建一個JobDetail實例,與Hello.calss綁定 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity( "myJob","group1" ).usingJobData("message","hello myJob1").usingJobData("FloatJobValue",3.14F).build(); //創建一個Trigger實例,定義該Job立即執行,並且每5秒執行一下,不斷重複下去 Trigger trigger = TriggerBuilder.newTrigger().withIdentity( "myTrigger","group1" ).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()). usingJobData("message","hello myJob2").usingJobData("DoubleJobValue",3.1D).build();
在HelloJob中,通過 JobExecutionContext 去獲取對應的值
JobKey key = jobExecutionContext.getJobDetail().getKey(); TriggerKey key1 = jobExecutionContext.getTrigger().getKey(); System.out.print("jobDetail:"+key.getName()+key.getGroup()); System.out.print("trigger:"+key1.getName()+key1.getGroup()); JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap(); JobDataMap jobDataMap1 = jobExecutionContext.getTrigger().getJobDataMap(); String jboMsg = jobDataMap.getString("message"); String jboMsg1 = jobDataMap1.getString("message"); System.out.print(jboMsg); System.out.print(jboMsg1);
第二種:Job實現類中添加srtter方法對應JobDataMap的鍵值(Quartz
框架默認的JobFactory實現類在初始化job實例對象時自動調用這些setter方法)
例如 直接在HelloJob中寫HelloScheduler中的key (message)的get set方法
private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }
System.out.print("我不信:"+message);
6.
//創建Scheduler實例 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start();
StdSchedulerFactory初始化時會讀取默認的quartx.properties文件
屬性解析
(1)
org.quartz.scheduler.instanceName:用來區分特定的調度器實例,可以按照給你
用途來給調度器起名。
org.quartz.scheduler.instanceId:和name一樣的
功能,但是這個值是在所有調度器實例中是唯一的