public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}
一个实现了Job接口的job类,Quartz需要知道各种关于这个job实例的属性。这些属性就通过JobDetail存储。
JobDetail通过JobBuilder创建。
import static org.quartz.JobBuilder.*;
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("myJob", "group1") // name "myJob", group "group1"
.build();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
public class HelloJob implements Job {
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
System.err.println("Hello! HelloJob is executing.");
}
}
参照以上代码,一个JobDetail实例创建时需要一个Job类,每次scheduler执行job时,就会创建一个新的实例再调用其execute(..)方法。当执行完成时,该job实例的引用就会被丢弃,该实例就会等待GC清理。这种行为导致的后果就是,job类必须有一个无参构造函数,并且一些状态属性字段不能定义在Job类。那对于Job的一些属性的定义、配置如何保存呢?关键是JobDataMap-JobDetail对象的一部分。
JobDataMap
JobDataMap用于存储一定数量(序列化的)的数据对象,这些对象可以在执行job时获得。JobDataMap实现了java 的 Map接口,添加了一些用于存储和检索基本类型数据的方法。
将数据放入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();
获得数据:
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);
}
}
如果Job类中有setter方法,Quarts默认的JobFactory实现将会在job初始化时自动调用这些setter方法。
Triggers也有相关联的JobDataMap。
执行job时可以获得这两个总的JobDataMap。如下:
JobDataMap dataMap = context.getMergedJobDataMap();
如果用Job的setter方法,如下,执行方法看起来就看干净一点儿。
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;
}
}