Quartz中定时调度针对特定目录的监控
????????? 在项目中以前采用Apache commons-io中的文件监听类实现针对特定目录的监听。在Quartz2.0针对特定目录的监控的job为DirectoryScanJob,针对目录的监听类为DirectoryScanListener。
?
实现目录的监听类:
package easyway.tbs.app.ejb;import java.io.File;import org.quartz.jobs.DirectoryScanListener;/** * 现实相关的DirectoryScanListener目录监听类的实现 * @author longgangbai * */public class EDirectoryScanListener implements DirectoryScanListener{public void filesUpdatedOrAdded(File[] afile) {for (File file : afile) {System.out.println(file.getPath());}}}?
?
创建触发器和调用相关的job
package easyway.tbs.app.ejb;import static org.quartz.CronScheduleBuilder.cronSchedule;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import java.text.ParseException;import java.util.Date;import org.quartz.CronTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerContext;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.SchedulerMetaData;import org.quartz.impl.StdSchedulerFactory;import org.quartz.jobs.DirectoryScanJob;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 定时扫描目录的定时任务的处理 * @author longgangbai * */public class DirectoryScanMain {/** * * @param args * @throws SchedulerException * @throws ParseException */public static void main(String[] args) throws SchedulerException, ParseException { Logger log = LoggerFactory.getLogger(DirectoryScanMain.class); log.info("------- Initializing -------------------"); // First we must get a reference to a scheduler //创建调度任务工厂 SchedulerFactory sf = new StdSchedulerFactory(); //创建调度对象 Scheduler sched = sf.getScheduler(); //创建一个调度上下文 SchedulerContext schedCtxt = sched.getContext(); //设置相关的目录监听类的 schedCtxt.put(EDirectoryScanListener.class.getName(), new EDirectoryScanListener()); log.info("------- Initialization Complete --------"); log.info("------- Scheduling Jobs ----------------"); // jobs can be scheduled before sched.start() has been called // job 1 will run every 20 seconds //创建相关的job详细信息 JobDetail job = newJob(DirectoryScanJob.class) .withIdentity("job1", "group1") .build(); //创建相关的触发器 CronTrigger trigger = newTrigger() .withIdentity("trigger1", "group1") .withSchedule(cronSchedule("0/20 * * * * ?")) .build(); // pass initialization parameters into the job //设置相关的job参数 job.getJobDataMap().put(DirectoryScanJob.DIRECTORY_NAME, "C://mule"); job.getJobDataMap().put(DirectoryScanJob.DIRECTORY_SCAN_LISTENER_NAME, EDirectoryScanListener.class.getName()); job.getJobDataMap().put(DirectoryScanJob.MINIMUM_UPDATE_AGE, "2000"); Date ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " + trigger.getCronExpression()); //启动相关调度的类的 sched.start(); log.info("------- Started Scheduler -----------------"); log.info("------- Waiting five minutes... ------------"); try { // wait five minutes to show jobs Thread.sleep(300L * 1000L); // executing... } catch (Exception e) { } log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); SchedulerMetaData metaData = sched.getMetaData(); log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");}}?