Jobs深入学习
代码回顾
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(5) .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 )并将它们全部添加到调度器中,从而在调度器中存储许多“实例定义”。