六. 使用 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 实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package org.cavaness.quartzbook.chapter7; import java.io.File; import java.sql.Timestamp; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SimpleFileScanListener implements org.quartz.jobs.FileScanListener { private static Log logger = LogFactory.getLog(SimpleFileScanListener.class); public void fileUpdated(String fileName) { File file = new File(fileName); Timestamp modified = new Timestamp(file.lastModified()); logger.info( fileName + " was changed at " + modified ); } } |
显然,你会想做些更有意义的事情,而不仅仅是写下一条日志信息,但是你从代码 7.12 中的简单例子中明白了要旨。我们也必须在部署 FileScanJob 时为它使用这一新型监听器。代码 7.13 展示了如何部署 FileScanJob。
代码 7.13. 部署 FileScanJob
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
package org.cavaness.quartzbook.chapter7; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; import org.quartz.jobs.FileScanJob; public class Listing_7_13 { private static Log logger = LogFactory.getLog(Listing_7_13.class); public static void main(String[] args) { Listing_7_13 example = new Listing_7_13(); try { Scheduler scheduler = example.createScheduler(); example.scheduleJob(scheduler); scheduler.start(); } catch (SchedulerException ex) { logger.error(ex); } } protected Scheduler createScheduler() throws SchedulerException { return StdSchedulerFactory.getDefaultScheduler(); } protected void scheduleJob(Scheduler scheduler) throws SchedulerException { // Store the FileScanListener instance scheduler.getContext().put("SimpleFileScanListener", new SimpleFileScanListener()); // Create a JobDetail for the FileScanJob JobDetail jobDetail = new JobDetail("FileScanJob", null, FileScanJob.class); // The FileScanJob needs some parameters JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put(FileScanJob.FILE_NAME, "C:\\quartz-book\\input1\\test.txt"); jobDataMap.put(FileScanJob.FILE_SCAN_LISTENER_NAME, "SimpleFileScanListener"); jobDetail.setJobDataMap(jobDataMap); // Create a Trigger and register the Job Trigger trigger = TriggerUtils.makeSecondlyTrigger(30); trigger.setName("SimpleTrigger"); trigger.setStartTime(new Date()); scheduler.scheduleJob(jobDetail, trigger); } } |
代码 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 Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。