一、Job接口:实现业务逻辑的任务接口,execute方法中实现具体逻辑(相似与TimerTask的run方法),html
1.1 Job实例在Quartz中的生命周期:java
每次调度器执行Job时,它在调用execute方法前会建立一个新的job实例,当调用完成后,关联的job对象实例被释放,释放的实例会被垃圾回收机制回收。框架
二、JobDetail(绑定job,又携带须要使用的属性):为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,他用来存储特定Job实例的状态信息,调度器须要借助JobDetail对象来添加Job实例。函数
2.1 重要属性:name/group/jobClass/jobDataMapui
一、JobExecutionContext:当scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;Job能经过JobExecutionContext对象访问到Quartz运行时候的环境以及job自己的明细数据。this
二、JobDataMap:spa
三、获取JobdataMap的两种方式:插件
A--数据赋值:链式写法:线程
JobDetail jobDetail = JobBuilder .newJob(HelloJob.class) .withIdentity("myJob", "group1") .usingJobData("param", "myTestJob") .usingJobData("jobDetailValue",3.14F) .build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("myTrigger", "group1") .startNow(). usingJobData("param","myTestTrigger"). usingJobData("TriggerValue",3.1D) .withSchedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()) .build();
B--获取数据:code
方法一: 从Map中直接获取:
(1)arg0.getTrigger().getJobDataMap()和arg0.getJobDetail().getJobDataMap();
public void execute(JobExecutionContext arg0) throws JobExecutionException { //打印当前的执行时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec Time is:"+sdf.format(date)); //编写具体的业务逻辑 //A经过Map-取数方法1 JobKey jobKey=arg0.getJobDetail().getKey(); TriggerKey triggerKey = arg0.getTrigger().getKey(); JobDataMap jobDataMap =arg0.getJobDetail().getJobDataMap(); JobDataMap triggerDataMap = arg0.getTrigger().getJobDataMap(); System.out.println("Job name:"+jobKey.getName()+"-Job Group:"+jobKey.getGroup()); System.out.println("Trigger name:"+triggerKey.getName()+"-Trigger Group:"+triggerKey.getGroup()); System.out.println("Jobparam:"+jobDataMap.getString("param")); System.out.println("jobDetailValue:"+jobDataMap.getFloat("jobDetailValue")); System.out.println("triggerparam:"+triggerDataMap.getString("param")); System.out.println("TriggerValue:"+triggerDataMap.getDouble("TriggerValue")); }
(2)getMergedJobDataMap()方法(key相同时,Trigger优先于JobDetail)
JobDataMap DataMap = arg0.getMergedJobDataMap(); System.out.println("param:"+DataMap.getString("param"));
方法二:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法)
添加同名私有变量,写setter方法
public class HelloJob implements Job{ private String param; private Double TriggerValue; private Float jobDetailValue; public void setParam(String param) { this.param = param; } public void setTriggerValue(Double triggerValue) { TriggerValue = triggerValue; } public void setJobDetailValue(Float jobDetailValue) { this.jobDetailValue = jobDetailValue; } }
利用实例化时的反射机制,settet()自动赋值
//经过setter方法获取数据 System.out.println("param:"+param); System.out.println("jobDetailValue:"+TriggerValue); System.out.println("TriggerValue:"+jobDetailValue);
运行结果:
Current Exec Time is:2018-01-18 20:13:02 param:myTestTrigger jobDetailValue:3.1 TriggerValue:3.14 Current Exec Time is:2018-01-18 20:13:03 param:myTestTrigger jobDetailValue:3.1 TriggerValue:3.14
SimpleTrigger:在一个指定的时间内执行一次做业任务,或在指定时间间隔屡次执行任务
.withShedule( SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds() )
CornTrigger:(经常使用)基于日历的做业调度器
.withShedule( CronScheduleBuilder.cronSchedule("* * * * * ? *")//cron表达式 )
cron表达式:https://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html
//StdSchedulerFactory工厂类(经常使用) SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); //DirectSchedulerFactory工厂类 DirectSchedulerFactory factory= DirectSchedulerFactory.getInstance(); Scheduler scheduler = factory.getScheduler();
StdShedulerFactory:
Sheduler的主要函数:
Thread.sleep(2000L); scheduler.standby();void shutdown(Boolean boolean) // true表示等待全部正在执行的Job执行完毕以后再关闭,false表示直接关闭 ,也可空。
文档的位置和加载顺序:优先读取用户自定义的quartz.properties,若无则读取Jar包里面的配置文件
组成部分:调度器属性/线程池属性/做业存储设置/插件配置
调度器属性:
线程池属性:
做业存储设置:Job和Trigger信息是如何被存储的
插件配置