Job实例在Quartz中的生命周期
每次调度器执行Job时,它在调用execute方法前会创建一个新的Job实例。(前提是该Job实例是由JobDetail创建)。
当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。
浅谈JobDetail
JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。
JobDetail重要属性:
- name
- group (如果不设置,默认置为:DEFAULT)
- jobClass
- jobDataMap
name、group、jobClass三个属性获取方式:
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "group1").build();
System.out.println(jobDetail.getKey().getName());
System.out.println(jobDetail.getKey().getGroup());
System.out.println(jobDetail.getClass().getName());
浅谈JobExecutionContext
JobExecutionContext是什么:
- 当Schedular调用一个Job,就会将JobExecutionContext传递给Job的execute()方法
- Job能够通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据
JobDataMap是什么:
- 在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取
- JobDataMap可以用来装载任何可序列化的数据对象,当Job实例对象被执行时,这些参数对象会传递给它
- JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型。
获取JobDataMap的两种方式:
- 从Map中直接获取
首先在JobDetail中设置值
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.usingJobData("message","hello job") //在JobDetail中设置值
.usingJobData("jobKey","is job") //在JobDetail中设置值
.build();
然后在Trigger中设置值
Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
.usingJobData("message", "hello trigger") //在Trigger中设置值
.usingJobData("triggerKey", "is trigger") //在Trigger中设置值
.startNow() //一旦加入schedular,立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
.withIntervalInSeconds(2) //每隔两秒执行一次
.repeatForever() //一直执行,直到程序死去
).build();
最后在job实例中获取先前设置的值
JobKey key=context.getJobDetail().getKey();
String jobName=key.getName(); //获取JobDetail的name;
String jobGroup=key.getGroup(); //获取JobDetail的group;
TriggerKey trKey=context.getTrigger().getKey();
String triggerName=trKey.getName(); //获取Trigger的name;
String triggerGroup=trKey.getGroup(); //获取Trigger的group;
//第一种方式获取值
//获取JobDetail中的值
JobDataMap dataMap=context.getJobDetail().getJobDataMap();
String k1= dataMap.getString("message");
String k2= dataMap.getString("jobKey");
//获取Trigger中的值
JobDataMap trDataMap=context.getTrigger().getJobDataMap();
String t1=trDataMap.getString("message");
String t2=trDataMap.getString("triggerKey");
System.out.println("jobName:"+jobName+"jobGroup:"+jobGroup
+"triggerName:"+triggerName+"triggerGroup:"+triggerGroup
+k1+k2+t1+t2);
这第一种方式除了这种方法获取,还有一种方法,这种方法是将JobDetail与Trigger中设置的融合到一个JobDataMap中:
//第一种方式的第二种方法获取值
JobDataMap dataMap=context.getMergedJobDataMap();
String msg=dataMap.getString("message"); //如果JobDetail与Trigger中设置的key值一样,则Trigger中会覆盖JobDetail中的值
String jobKey=dataMap.getString("jobKey");
String triggerKey=dataMap.getString("triggerKey");
System.out.println(jobName+jobGroup+msg+jobKey+triggerKey);
- Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化Job实例对象时会自动地调用这些setter方法)
创建对应的成员变量:
private String message;
private String jobKey;
private String triggerKey;
生成对应的getter与setter方法,然后就可以获取了。