Quartz Job Scheduling Framework[翻译]第七章. 实现 Quartz 监听器 (第五部分)
六. 使用 FileScanListener
Quartz 框架还包含一个我们未曾提及的监听器。这个监听器不像别的,因为它是为特定目的而设计的:同框架所带的一个工具 Job 一起用的。
这个监听器就是 org.quartz.jobs.FileScanListener 接口,它显式的设计为 FileScanJob 所用的,这一 Job 也在 org.quartz.jobs 包中。FileScanJob 检查某一指定文件的 lastModifiedDate。当某人改变了这个文件,这个 Job 就调用 FileScanListener 的 fileUpdated() 方法。
就像使用其他类型的 Quartz 监听器一样,你必须创建一个实现了 FileScanListener 接口的具体类。只有一个方法需要实现:
public void fileUpdated(String fileName);
代码 7.12 展了了我们的一个极简单的 FileScanListener 实现。
代码 7.12. 一个简单的 FileScanListener 实现
显然,你会想做些更有意义的事情,而不仅仅是写下一条日志信息,但是你从代码 7.12 中的简单例子中明白了要旨。我们也必须在部署 FileScanJob 时为它使用这一新型监听器。代码 7.13 展示了如何部署 FileScanJob。
代码 7.13. 部署 FileScanJob
代码 7.13 中的程序像几乎所有别的 必须部署一个 Job 的 Quartz 应用。FileScanJob 需要两个参数:要监视文件的 FILE_NAME,和 FileScanListener(FILE_SCAN_LISTENER_NAME) 的名称。这两个参数的值会存在 JobDataMap 中,因此 FileScanJob 能访问到它们。
仅有一个特别要注意,容易出错的地方就是要确保添加了一个 FileScanListener 到 SchedulerContext 中。这在代码 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) 进行许可。
Quartz 框架还包含一个我们未曾提及的监听器。这个监听器不像别的,因为它是为特定目的而设计的:同框架所带的一个工具 Job 一起用的。
这个监听器就是 org.quartz.jobs.FileScanListener 接口,它显式的设计为 FileScanJob 所用的,这一 Job 也在 org.quartz.jobs 包中。FileScanJob 检查某一指定文件的 lastModifiedDate。当某人改变了这个文件,这个 Job 就调用 FileScanListener 的 fileUpdated() 方法。
就像使用其他类型的 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 能访问到它们。
仅有一个特别要注意,容易出错的地方就是要确保添加了一个 FileScanListener 到 SchedulerContext 中。这在代码 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) 进行许可。