代码回顾

    Quartz 需要了解你可能希望该作业的实例拥有的各种属性,这是通过JobDetail 类完成的。

     JobDetail 实例是使用 JobBuilder 类构建的。  

        JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build(); // Trigger the job to run now, and then repeat every 5 seconds
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds()
.repeatForever())
.build(); // Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);

JobDetail的生命周期

    1.我们给调度程序提供了一个 JobDetail 实例,并且它知道在构建 JobDetail 时只需提供作业的类就可以执行的工作类型。

      2.调度程序执行任务时,每个(以及每个)时间都在调用它的 execute(..) 方法之前创建一个类的新实例。 
    3.当执行完成时,对作业类实例的引用被删除,然后实例被垃圾收集。

JobDataMap

     这种行为的一个分支是,作业必须有一个无参数的构造函数(当使用默认的JobFactory实现时)。 
     另一个分支是,在作业类上定义状态数据字段是没有意义的,因为它们的值不会在作业执行之间保留。

      若需要传数据,则可以使用JobDataMap

      JobDataMap 可以用来保存任何数量(可序列化)的数据对象,您希望在它执行时将它们提供给作业实例。 
                 JobDataMap 是 Java Map 接口的一个实现,它提供了一些用于存储和检索原始类型数据的便利方法。

  代码实现:

   这里有一些快速的片段,可以将数据输入 JobDataMap,同时定义/构建 JobDetail,然后将作业添加到调度器:

JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1")
.usingJobData("user", "goxcheer")
.usingJobData("words", "Hello Quartz")
.build();

   执行时我们可以将这些数据拿到,方式如下:

    

    public HelloJob() {
super();
} public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String str1 =jobDataMap.getString("user");
String str2 = jobDataMap.getString("words");
System.out.println("Instance:"+key+ " user:"+str1+" words:"+str2);
}

MergedJobDataMap

    如果你添加 setter 方法工作类,对应键的名字 JobDataMap(如setJobSays数据(字符串val)方法在上面的示例中),然后 Quartz 默认 JobFactory 实现将自动调用这些 setter 当工作被实例化,从而防止需要显式地获得值的 map 在你的执行方法。

    对应的不同代码:

public class HelloJob implements Job{

	private String user;
private String words; public HelloJob() {
super();
} public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey key = context.getJobDetail().getKey();
context.getMergedJobDataMap(); //此处不同
System.out.println("Instance:"+key+ " user:"+user+" words:"+words);
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getWords() {
return words;
} public void setWords(String words) {
this.words = words;
}
}

 JobInstance

   您可以创建一个作业类,并通过创建多个 JobDetails 实例(每个实例都有自己的属性和 JobDataMap )并将它们全部添加到调度器中,从而在调度器中存储许多“实例定义”。

04-14 06:25