当我们自定义一个Job(即,实现Job接口,并将要执行的真实业务放置到execute方法中)后,Quartz在每次执行这个Job时,都会根据这个自定义的Job的class生成不同的对象
JobDataMap
如果给一个Job提供一些定制化的信息呢,例如一些参数值,此时可以通过JobDataMap来实现,例如通过如下的代码来将一些参数值放置到JobDataMap中
// define the job and tie it to our DumbJob class
JobDetail job = newJob(DumbJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.141f)
.build();
可以通过如下的方式来取得刚才设置到JobDataMap中的值
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
}
如果使用了持久化形式的JobStore的话,可以将JobDataMap中的值存储到数据库中(存储到数据库中的值都将被序列化,因此对于存储到JobDataMap中的值的类型要在存储之前多做考虑)
也可以在Job中定义符合JavaBean规范的setter方法,从而当Job被实例化时,将这些值注入到Job当中,类似如下的形式
public class DumbJob implements Job {
String jobSays;
float myFloatValue;
ArrayList state;
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
JobKey key = context.getJobDetail().getKey();
JobDataMap dataMap = context.getMergedJobDataMap(); // Note the difference from the previous example
state.add(new Date());
System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}
public void setJobSays(String jobSays) {
this.jobSays = jobSays;
}
public void setMyFloatValue(float myFloatValue) {
myFloatValue = myFloatValue;
}
public void setState(ArrayList state) {
state = state;
}
}
Job “Instances”
可以为不同的Job绑定不同的JobDataMap.
当一个Trigger被触发后,与此相关联的Job就被实例化