Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第五部分)

六. 使用 FileScanListener


Quartz 框架还包含一个我们未曾提及的监听器。这个监听器不像别的,因为它是为特定目的而设计的:同框架所带的一个工具 Job 一起用的。

这个监听器就是 org.quartz.jobs.FileScanListener 接口,它显式的设计为 FileScanJob 所用的,这一 Job 也在 org.quartz.jobs 包中。FileScanJob 检查某一指定文件的 lastModifiedDate。当某人改变了这个文件,这个 Job 就调用 FileScanListenerfileUpdated() 方法。

就像使用其他类型的 Quartz 监听器一样,你必须创建一个实现了 FileScanListener 接口的具体类。只有一个方法需要实现:

public void fileUpdated(String fileName);

代码  7.12 展了了我们的一个极简单的 FileScanListener 实现。

代码 7.12. 一个简单的 FileScanListener 实现
 1package org.cavaness.quartzbook.chapter7;
 2
 3import java.io.File;
 4import java.sql.Timestamp;
 5
 6import org.apache.commons.logging.Log;
 7import org.apache.commons.logging.LogFactory;
 8
 9public class SimpleFileScanListener implements org.quartz.jobs.FileScanListener {
10     private static Log logger = LogFactory.getLog(SimpleFileScanListener.class);
11
12     public void fileUpdated(String fileName) {
13          File file = new File(fileName);
14          Timestamp modified = new Timestamp(file.lastModified());
15
16          logger.info( fileName + " was changed at " + modified );
17     }
18}

显然,你会想做些更有意义的事情,而不仅仅是写下一条日志信息,但是你从代码 7.12 中的简单例子中明白了要旨。我们也必须在部署 FileScanJob 时为它使用这一新型监听器。代码 7.13 展示了如何部署 FileScanJob

代码 7.13. 部署 FileScanJob
 1package org.cavaness.quartzbook.chapter7;
 2
 3import java.util.Date;
 4
 5import org.apache.commons.logging.Log;
 6import org.apache.commons.logging.LogFactory;
 7import org.quartz.JobDataMap;
 8import org.quartz.JobDetail;
 9import org.quartz.Scheduler;
10import org.quartz.SchedulerException;
11import org.quartz.Trigger;
12import org.quartz.TriggerUtils;
13import org.quartz.impl.StdSchedulerFactory;
14import org.quartz.jobs.FileScanJob;
15
16public class Listing_7_13 {
17     private static Log logger = LogFactory.getLog(Listing_7_13.class);
18
19     public static void main(String[] args) {
20          Listing_7_13 example = new Listing_7_13();
21
22          try {
23               Scheduler scheduler = example.createScheduler();
24               example.scheduleJob(scheduler);
25               scheduler.start();
26
27          } catch (SchedulerException ex) {
28               logger.error(ex);
29          }
30    }
31
32    protected Scheduler createScheduler() throws
33         SchedulerException {
34
35         return StdSchedulerFactory.getDefaultScheduler();
36    }
37
38    protected void scheduleJob(Scheduler scheduler) throws
39         SchedulerException {
40
41         // Store the FileScanListener instance
42         scheduler.getContext().put("SimpleFileScanListener",
43                   new SimpleFileScanListener());
44
45         // Create a JobDetail for the FileScanJob
46         JobDetail jobDetail = new JobDetail("FileScanJob", null,
47                   FileScanJob.class);
48
49         // The FileScanJob needs some parameters
50         JobDataMap jobDataMap = new JobDataMap();
51         jobDataMap.put(FileScanJob.FILE_NAME,
52                   "C:\\quartz-book\\input1\\test.txt");
53         jobDataMap.put(FileScanJob.FILE_SCAN_LISTENER_NAME,
54                   "SimpleFileScanListener");
55         jobDetail.setJobDataMap(jobDataMap);
56
57         // Create a Trigger and register the Job
58         Trigger trigger = TriggerUtils.makeSecondlyTrigger(30);
59         trigger.setName("SimpleTrigger");
60         trigger.setStartTime(new Date());
61
62         scheduler.scheduleJob(jobDetail, trigger);
63    }
64}

代码 7.13 中的程序像几乎所有别的 必须部署一个 Job 的 Quartz  应用。FileScanJob 需要两个参数:要监视文件的 FILE_NAME,和 FileScanListener(FILE_SCAN_LISTENER_NAME) 的名称。这两个参数的值会存在 JobDataMap 中,因此 FileScanJob 能访问到它们。

仅有一个特别要注意,容易出错的地方就是要确保添加了一个 FileScanListenerSchedulerContext 中。这在代码 7.13 中是通过如下代码片断完成的:

scheduler.getContext().put("SimpleFileScanListener",
     new SimpleFileScanListener());

这一步是必须的,因为 FileScanJob 获取到 SchedulerContext 的引用,然后使用设置到 JobDataMap 中的名称找寻 FileScanListener

jobDataMap.put(FileScanJob.FILE_SCAN_LISTENER_NAME,
     "SimpleFileScanListener");

如果你还有所困惑,别担心:看一看 org.quartz.jobs.FileScanJob 类的源代码吧。这是对待开源软件最好的方式了。 永久链接 https://yanbin.blog/quartz-job-scheduling-framework-7-5/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。