Quartz入门指南
来源:互联网 发布:char转int c语言 编辑:程序博客网 时间:2024/05/18 00:39
什么是Quartz?
Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。
作为一个优秀的开源调度框架,Quartz 具有以下特点:
- 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
- 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
- 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容;
简单的来说,Quartz
可以理解为是一个定时器的框架。
Quartz的运行原理
Quartz中最重要的四个接口为:scheduler(任务调度器)、tigger(触发器,用于定义任务调度时间规则)、job(任务,即被调度的任务)、jobDetail(定义Job的实例).。
job 和 jobDetail
在 Quartz 中,job 用于表示被调度的任务。在实际的应用中,需要定义了一个实现Job接口的类,这个类仅仅表明该job需要完成什么类型的任务,除此之外,Quartz还需要知道该Job实例所包含的属性;这将由JobDetail类来完成。
tigger
在 Quartz 中,trigger 是用于定义调度时间的元素,即按照什么时间规则去执行任务。trigger也有很多类型,可以根据实际需要来选择。其中最为常用的两种tigger为:SimpleTrigger
和 CronTirgger 。
SimpleTrigger: 简单的触发
SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
如果你想让触发器在2014年1月11日,上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger 就可以满足你的要求。CronTrigger: 表达式触发
如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。
使用CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续。
scheduler
在 Quartz 中, scheduler 由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二种工厂 StdSchedulerFactory 使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 为例讲解。这也是LZ在项目中所使用的 scheduler 类。
Quartz 核心元素关系图
Quartz中4个接口之间的调用关系
Quartz中4个接口之间的调用关系
关于这四个接口更加详细的介绍可以参考以下内容:
- 官方英文文档
- 翻译后的中文文档
Quartz的demo
log4j.properties 文件的配置为:
本例子通过log4j来打印定时任务需要打印的内容。log4j.rootLogger=DEBUG,A1log4j.logger.com.taotao = DEBUGlog4j.logger.org.mybatis = DEBUGlog4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
通过实现 job 接口定义我们自己的任务类:
public class HelloJob implements Job { private static Logger _log = LoggerFactory.getLogger(HelloJob.class); public HelloJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { _log.info("Hello World! - " + new Date()); }}
然后,实现任务调度的主程序,如下所示:
本实例中,我们利用 CronTrigger 实现一个每分钟执行一次的任务调度。public class SimpleCronExample { public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleCronExample.class); log.info("------- Initializing ----------------------"); // 定义调度器 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // 获取当前时间的下一分钟 Date runTime = evenMinuteDate(new Date()); log.info("------- Scheduling Job -------------------"); // 定义job JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); // 定义触发器,每2秒执行一次 Trigger trigger = newTrigger().withIdentity("trigger1", "group1") .withSchedule(cronSchedule("0/5 * * * * ?")).build(); // 将job注册到调度器 sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); // 启动调度器 sched.start(); log.info("------- Started Scheduler -----------------"); // 等待1分钟 log.info("------- Waiting 60 seconds... -------------"); try { Thread.sleep(60L * 1000L); } catch (Exception e) { // } // 关闭调度器 log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleCronExample example = new SimpleCronExample(); example.run(); }}
此时控制台将没过5秒钟输出一次:
Hello World!
该demo的下载地址为:https://github.com/9527dong/demo/tree/master/quartz
相关博文:
Quartz之CronTrigger
- Quartz快速入门指南
- Quartz 快速入门指南
- Quartz入门指南
- Quartz指南
- Quartz 指南
- Quartz 入门
- Quartz入门
- quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz入门
- Quartz开发指南
- 【Quartz】Quartz任务调度入门
- Quartz(01) Quartz快速入门
- Quartz 2D编程指南
- HDU 3342&&UVA10305&&考试day3 T1
- 多线程的共享资源的解决方案
- linux 安装mysql数据库——tar.gz包解压安装法
- Eclipse之task任务提醒
- JAVA中的this
- Quartz入门指南
- 网络原理,以及对VMware Workstation虚拟网络VMnet0、VMnet1、VMnet8的图解
- Bootstrap实现部分网页中常见的页面效果!
- 管理信息系统---第一遍导图
- 数据结构【排序算法】——冒泡排序
- VTK图像处理之访问图像像素值
- iOS 开发gitignore
- POJ1458CommonSubsequence
- ofbiz service 参数验证