Quartz学习(2)

来源:互联网 发布:数据库 er设计 编辑:程序博客网 时间:2024/06/10 23:20

Job与JobDtail,JobDataMap

譬如我们的测试文件中,为啥创建的是一个jobDetail实例,而不是我们所需要的Job(任务)实例呢?那我们来看看Job的生命周期,当 scheduler(调度器) 执行 job 时,在调用其 execute() 方法之前会创建该类的一个新的实例,执行完毕,该实例的引用就会被丢弃,实例会被垃圾回收。所以在 job 类中,不应该定义有数据的属性,因为 job 多次执行中,这些属性的值不会保留。(另外job 必须有一个无参的构造函数,如果没有的话,job就不会执行。)所以,如果我们需要为Job(任务)传递我们需要的数据咋办呢?所以,我们返回的是JobDetail实例,JobDetail可以传递数据,而真正的任务逻辑在Job之中,JobDetail好像就是一个可以传递数据的Job(我们在创建 JobDetail 时,将要执行的 job 的类名传给了 JobDetail,所以 scheduler 就知道了要执行何种类型的 job),即:

JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("JobName", "group1").build();

JobDetail可以获得其的名字(getName),组名(getGroup),以及类(getClass),即(在测试类中,不是MyJob类

System.out.println(job.getKey().getName()); //JobName
System.out.println(job.getKey().getGroup()); //group1
System.out.println(job.getClass()); //class org.quartz.impl.JobDetailImpl

那么,我们怎么进行向我们的任务传递数据呢?这就需要JobDataMap了,jobDataMapMap 中可以包含不限量的(序列化)数据对象

,在 job 实例执行的时候,可以使用其中的数据;JobDataMap 是 Java Map 接口的一个实现,额外增加了一些便于存取的基本数据

类型的方法。通过的是usingJobData,

这写就是其可以传递的类型概览,此时的JobDtail就成为这样了

JobDetail job = JobBuilder.newJob(MyJob.class)
.usingJobData("status",new Integer(0))
.usingJobData("msg", "ok")
.withIdentity("JobName", "group1").build();


现在我们就将数据封装在JobDetail中了,那我们如何在MyJob类中获得呢?可以用我们的Job实现类(MyJob类)的execute的唯一

一个参数JobExecutionContext,如图:

JobExecutionContext如何获得,JobExecutionContext其实不仅可以获得JobDetail中的数据,亦可以获得Trigger中的数据,获得

属性值时,有两种方式:

(-)通过JobExecutionContext的getJobDetail()或者getTrigger(),前者是获得JobDetail中的数据,后者是JobDetail中的数据

System.out.println(context.getJobDetail().getJobDataMap().get("status")); //0
System.out.println(context.getJobDetail().getJobDataMap().get("msg")); //ok

获得trigger中的数据一样,只需将getJobDetail()改为getTrigger()即可,我们也可以将这两个分得不那么清楚,使用

getMergedJobDataMap()统一获得

System.out.println(context.getMergedJobDataMap().get("status"));
System.out.println(context.getMergedJobDataMap().get("msg"));
// 0 ok

但是这样的话,如果jobDtail和trigger中的属性名一样的话,就只会获得重复属性名trigger的值。

(二)通过私有属性的set获得

private Integer status;
private String msg;


public void setStatus(Integer status) {
this.status = status;
}


public void setMsg(String msg) {
this.msg = msg;
}

然后(按属性名字自动赋值)

System.out.println(status); //0
System.out.println(msg); //ok


另外JobExecutionContext中也可以获得名字(getName),组名(getGroup),以及类(getClass)。

如有不足,请批评指正。


原创粉丝点击