Java 定时任务调度工具 Quartz(Part 2)
2018-01-18 00:00
609 查看
摘要: java EE开发
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();
2、JobDataMap:
在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取;
JobDataMap可以用来装载任何可序列化的数据对象,当Job实例对象被执行时这些参数对象会传递给它;
JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法来存取基本数据类型;
3、获取JobdataMap的两种方式:
A--数据赋值:链式写法:
B--获取数据:
方法一: 从Map中直接获取:
(1)arg0.getTrigger().getJobDataMap()和arg0.getJobDetail().getJobDataMap();
(2)getMergedJobDataMap()方法(key相同时,Trigger优先于JobDetail)
方法二:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法)
添加同名私有变量,写setter方法
利用实例化时的反射机制,settet()自动赋值
运行结果:
StartTime:触发器的时间表首次被触发的时间,类型java.util.Date
EndTime:指定触发器不再被触发的时间,类型Date
SimpleTrigger:在一个指定的时间内执行一次作业任务,或在指定时间间隔多次执行任务
CornTrigger:(常用)基于日历的作业调度器
cron表达式:https://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html
SchedulerFactory有两种实现类:StdShedulerFactory(声明式配置,常用)和DirectSchedulerFactory(需在代码中配置参数,不常用)
Scheduler的创建方式
使用一组参数(java.util.Properties)来创建和初始化Quartz调度器;
配置文件指定线程数和参数获取方式等配置信息,配置参数一般存储在quartz.properties中;
调用getScheduler方法就能创建和初始化调度器对象
Sheduler的主要函数:
Date ScheduleJob(JobDetail jobDetail,Trigger trigger) //返回值是最近一次即将执行的时间
void start()
void standby() //执行2秒后自动挂起
组成部分:调度器属性/线程池属性/作业存储设置/插件配置
调度器属性:
org.quartz.scheduler.instanceName属性用于区分特定的调度器实例,可按功能命名。
org.quartz.scheduler.instanceId 同上,但是必须在所有调度器实例中唯一,可为AUTO
线程池属性:
threadCount:10左右
threadPriority:优先级(default 5)
org.quartz.threadPool.class
作业存储设置:Job和Trigger信息是如何被存储的
插件配置
一、浅谈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())   7fe0 ; .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秒后自动挂起
Thread.sleep(2000L); scheduler.standby();void shutdown(Boolean boolean) // true表示等待所有正在执行的Job执行完毕之后再关闭,false表示直接关闭 ,也可空。
五、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信息是如何被存储的
插件配置
相关文章推荐
- Java 定时任务调度工具 Quartz(Part 1)
- Java定时任务调度工具详解(8)— Quartz 之 quartz.properties文件
- Java定时任务调度工具详解之Quartz篇(中级)一:浅谈JobExecutionContext&JobDatai&浅谈Trigger
- Java定时任务调度工具详解(3)— Quartz 简介
- Java定时任务调度工具详解(5)— Quartz 之 Trigger
- Java定时任务调度工具详解之Quartz
- Java定时任务调度工具详解之Quartz篇(中级)二:SimpleTrigger& CronTrigger&浅谈Scheduler&QuartzProperties文件
- Java定时任务调度工具详解(6)— Quartz 之 SimpleTrigger、CronTrigger、Cron表达式
- Java定时任务调度工具详解(7)— Quartz 之 Scheduler
- java定时任务调度工具-quartz
- java定时任务调度工具Timer和Quartz
- Quartz---Java定时任务调度工具
- Java定时任务调度工具详解之Quartz篇
- Java定时任务调度工具详解(4)— Quartz 之 Job/JobDetail/JobExecutionContext/JobDataMap
- java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫
- Quartz实现定时任务的配置方法(纯java作业调度框架)
- Java作业调度/定时任务 Spring和Quartz整合
- Java Quartz 构建定时调度任务
- 定时任务调度工具Quartz【进阶】
- [译]Java定时任务调度-Quartz文档(八)SchedulerListeners