Quartz学习(2)

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)。

如有不足,请批评指正。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值