一、浅谈Job和JobDetail
1、Job接口:实现业务逻辑的任务接口,execute方法中实现具体逻辑(类似与TimerTask的run方法),
1.1 Job实例在Quartz中的生命周期:
每次调度器执行Job时,它在调用execute方法前会创建一个新的job实例,当调用完成后,关联的job对象实例被释放,释放的实例会被垃圾回收机制回收。
2、JobDetail(绑定job,又携带需要使用的属性):为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,他用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。
2.1 重要属性:name/group/jobClass/jobDataMap
- name:jobDetail.getKey().getName();
- group:(默认DEFAULT组)jobDetail.getKey().getGroup();
- jobClass:jobDetail.getJobClass().getName();
二、浅谈JobExecutionContext与JobDataMap
1、JobExecutionContext:当scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及job本身的明细数据。
2、JobDataMap:
- 在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取;
- JobDataMap可以用来装载任何可序列化的数据对象,当Job实例对象被执行时这些参数对象会传递给它;
- JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法来存取基本数据类型;
3、获取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--获取数据:
方法一: 从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
三、浅谈Trigger
- JobKey:job实例的标识,触发器被触发时,该指定的job实例会被执行
- StartTime:触发器的时间表首次被触发的时间,类型java.util.Date
- EndTime:指定触发器不再被触发的时间,类型Date
SimpleTrigger:在一个指定的时间内执行一次作业任务,或在指定时间间隔多次执行任务
.withShedule(
SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds()
)
CornTrigger:(常用)基于日历的作业调度器
.withShedule(
CronScheduleBuilder.cronSchedule("* * * * * ? *")//cron表达式
)
cron表达式:https://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html
四、浅谈Scheduler
- 所有的Scheduler实例应该由SchedulerFactory来创建、
- SchedulerFactory有两种实现类:StdShedulerFactory(声明式配置,常用)和DirectSchedulerFactory(需在代码中配置参数,不常用)
- Scheduler的创建方式
//StdSchedulerFactory工厂类(常用) SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler scheduler = sfact.getScheduler(); //DirectSchedulerFactory工厂类 DirectSchedulerFactory factory= DirectSchedulerFactory.getInstance(); Scheduler scheduler = factory.getScheduler();
StdShedulerFactory:
- 使用一组参数(java.util.Properties)来创建和初始化Quartz调度器;
- 配置文件指定线程数和参数获取方式等配置信息,配置参数一般存储在quartz.properties中;
- 调用getScheduler方法就能创建和初始化调度器对象
Sheduler的主要函数:
- Date ScheduleJob(JobDetail jobDetail,Trigger trigger) //返回值是最近一次即将执行的时间
- void start()
- void standby() //执行2秒后自动挂起
-
void shutdown(Boolean boolean) // true表示等待所有正在执行的Job执行完毕之后再关闭,false表示直接关闭 ,也可空。Thread.sleep(2000L); scheduler.standby();
五、Quartz.properties文件
文档的位置和加载顺序:优先读取用户自定义的quartz.properties,若无则读取Jar包里面的配置文件
组成部分:调度器属性/线程池属性/作业存储设置/插件配置
调度器属性:
- org.quartz.scheduler.instanceName属性用于区分特定的调度器实例,可按功能命名。
- org.quartz.scheduler.instanceId 同上,但是必须在所有调度器实例中唯一,可为AUTO
线程池属性:
- threadCount:10左右
- threadPriority:优先级(default 5)
- org.quartz.threadPool.class
作业存储设置:Job和Trigger信息是如何被存储的
插件配置
来源:oschina
链接:https://my.oschina.net/u/3740897/blog/1609320