开源作业调度软件Quartz2.2.2 官方Examples学习
来源:互联网 发布:苏州聚合数据 编辑:程序博客网 时间:2024/06/05 10:14
1,Examples 1 中学到的东西
①在Quartz中,作业的配置与作业具体需要完成什么任务是分开的。作业的配置代码编写在一个类中;如获取调度器:
SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler();
②存储作业的相关属性、数据:
JobDetail jobDetail = newJob(ScanDirectoryJob.class).withIdentity("job1", "group1").build();jobDetail.getJobDataMap().put(ScanDirectoryJob.SCANDIRECTORY, "F:\\项目技术文档-参考资料\\ohter");
③设置作业的触发条件。可以给同一个作业设置多个触发条件。
SimpleTrigger trigger = (SimpleTrigger)newTrigger().withIdentity("trigger1", "group1").startAt(futureDate(10, IntervalUnit.SECOND)).build();
④将作业添加给调度器。可以给同一个Scheduler对象添加多个作业。
Date startDate = sched.scheduleJob(jobDetail, trigger);//throws SchedulerException
⑤启动调度器,开始作业的调度。在这里,作业属性的设置、调度是在main线程上执行的,当作业被调度启动后,Quartz有线程池功能,从线程池中取出线程来执行具体的任务。
sched.start();
⑥最后,作业的任务实现代码编写在另一个类中,这个类需要 implements Job接口,并实现execute()方法,在execute()方法中定义该作业需要实现的具体功能。
下面贴一个定时调度的例子。该调度器在当前时间10s之后去扫描F盘中的doc文件并列出文件的绝对路径和大小。
a):指定扫描的文件类型:
public class FileExtensionsFileFilter implements FileFilter{private String extensions;public FileExtensionsFileFilter(String extensions){this.extensions = extensions;}@Overridepublic boolean accept(File pathname) {//only accept specified extensions fileString lcaseFileName = pathname.getName().toLowerCase();return (pathname.isFile() && lcaseFileName.indexOf(extensions) > 0) ? true : false;}}
b):扫描任务的具体实现
import java.io.File;import java.io.FileFilter;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.slf4j.LoggerFactory;public class ScanDirectoryJob implements Job{public static final String SCANDIRECTORY = "F:\\项目技术文档-参考资料\\quartz";//默认扫描目录public static org.slf4j.Logger logger = LoggerFactory.getLogger(ScanDirectoryJob.class);@Overridepublic void execute(JobExecutionContext context)throws JobExecutionException {JobDataMap dataMap = context.getJobDetail().getJobDataMap();String dirDirectory = dataMap.getString(SCANDIRECTORY);//get scan directory from job configuration--JobDataMapif(dirDirectory == null)dirDirectory = ScanDirectoryJob.SCANDIRECTORY;File dir = new File(dirDirectory);if(!dir.exists() || !dir.isDirectory())throw new JobExecutionException("Directory does not exist OR It's not a Directory...");FileFilter filter = new FileExtensionsFileFilter(".doc");File[] files = dir.listFiles(filter);if(files == null || files.length == 0){logger.info("there is no file in directory");return;}logger.info("-----scan file's thread " + Thread.currentThread().getName() + "-----");int size = files.length;for(int i = 0; i < size; i++){File file = files[i];File aFile = file.getAbsoluteFile();long fileSize = file.length() / 1024;logger.info(aFile + " : size " + fileSize + "KB");}}}
c):作业的配置、设置触发条件、启动作业
import static org.quartz.DateBuilder.futureDate;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import org.quartz.DateBuilder.IntervalUnit;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SchedulerMetaData;import org.quartz.SimpleTrigger;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Date;public class ScanDirectoryJobExample {public void run() throws Exception{Logger log = LoggerFactory.getLogger(ScanDirectoryJobExample.class);log.info("--------initialzing--------");SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();log.info("-------initialzation completed-------");JobDetail jobDetail = newJob(ScanDirectoryJob.class).withIdentity("job1", "group1").build();SimpleTrigger trigger = (SimpleTrigger)newTrigger().withIdentity("trigger1", "group1").startAt(futureDate(10, IntervalUnit.SECOND)).build();jobDetail.getJobDataMap().put(ScanDirectoryJob.SCANDIRECTORY, "F:\\项目技术文档-参考资料\\ohter");Date startDate = sched.scheduleJob(jobDetail, trigger);//throws SchedulerExceptionlog.info("-----" + jobDetail.getKey() + " will run at " + startDate + " and repeat " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds. -----"); log.info("------- Starting Scheduler ----------------"); sched.start(); /* * 在这里必须让主线程sleep一段时间,这样让工作线程有足够的时间运行完从而查看执行结果。 * 不然,主线程后紧接着执行 sched.shutdown(),会使得任务还未执行完成就已经将调度器关闭了 */ try{ log.info("------Thread Name " + Thread.currentThread().getName() + "------"); Thread.sleep(60L * 1000);//wait 60s to show result }catch(Exception e){} log.info("-------shutting down -------"); sched.shutdown(); log.info("-------shutdown completed-------"); //display some stats about the scheduler that just run SchedulerMetaData metaData = sched.getMetaData(); log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");}public static void main(String[] args) throws Exception{ScanDirectoryJobExample scanDirectory = new ScanDirectoryJobExample();scanDirectory.run();}}
0 0
- 开源作业调度软件Quartz2.2.2 官方Examples学习
- 作业调度小软件
- 作业调度小软件
- quartz2.2简单调度Job
- Quartz2.2.x官方教程
- springMVC开源作业调度框架--quartz
- 开源作业调度框架---Quartz
- 开源的作业调度框架Quartz
- C#开发作业调度软件讲解
- spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
- quartz2学习资料
- 【转】Quartz2.2.x官方教程
- 作业调度框架 Quartz 学习笔记
- 作业调度框架 Quartz 学习笔记
- SGE作业调度系统学习笔记
- 作业调度框架 Quartz 学习笔记
- Quartz作业调度框架入门学习
- 开源的作业调度框架 - Quartz.NET
- C++ 11完美转发
- 《黑书》后缀数组学习笔记.
- Android图像处理
- iOS调试技巧
- 第八周项目三顺序串算法
- 开源作业调度软件Quartz2.2.2 官方Examples学习
- redirect forward区别
- KMP算法-字符串匹配
- openlayers2调用天地图WMTS服务简单例子
- C#学习日记27----属性
- JAVA 注解
- iOS 本地存储NSUserDefaults
- 关于哲学家进餐问题
- 使用Spring MVC统一异常处理实战