quartz简单应用以及quartz和timer的区别

分享人:王鹏举

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.拓展思考

7.参考文献

8.更多讨论

1.背景介绍

Quartz是一个作业调度库,可以与任何其他软件系统集成,也可以和其他软件系统一起使用。“job scheduler”作业调度程序是一个服务组件,负责执行(或通知)其他软件组件预定(预定)时间到达。 Quartz非常灵活,并且包含多个可以单独使用或一起使用的使用范例,以便实现所需的行为,并使我们能够以对项目最为“自然”的方式编写代码。 Quartz非常轻量级,而且只需要很少的设置/配置 - 如果您的需求相对比较基本的话,它实际上可以用于“开箱即用”的。 Quartz是容错的,可以在系统重启之间持续('记住')你的预定作业。

2.知识剖析

Quartz体系结构

Job: 是一个接口,只定义一个方法execute(JobExecutionContext context),在实现接口的execute方法中编写所需要定时执行的Job(任务), JobExecutionContext类提供了调度应用的一些信息。 Job运行时的信息保存在JobDataMap实例中;

JobDetail: Quartz每次调度Job时, 都重新创建一个Job实例, 所以它不直接接受一个Job的实例,相反它接收一个Job实现类(JobDetail:描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息), 以便运行时通过newInstance()的反射机制实例化Job

Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。 当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:

Calendar:org.quartz.Calendar和java.util.Calendar不同, 它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。 一个Trigger可以和多个Calendar关联, 以便排除或包含某些时间点

Scheduler:代表一个Quartz的独立运行容器, Trigger和JobDetail可以注册到Scheduler中,拥有各自的组及名称,组及名称必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法, 允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

Scheduler可以将Trigger绑定到某一JobDetail中, 这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger, 但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。

3.常见问题

quartz和timer的区别.

4.解决方案

5.编码实战

6.扩展思考

为什么不使用java.util.Timer

从JDK 1.3起,Java通过java.util.Timer和java.util.TimerTask类具有“内置”定时器功能 定时器没有持久性机制。 定时器有不灵活的调度(只能设置开始时间和重复间隔,没有基于日期,一天中的时间等) 定时器不使用线程池(每个定时器一个线程) 定时器没有真正的管理方案 - 你必须编写自己的机制来记住,组织和检索你的任务名称等。

7.参考文献

http://www.quartz-scheduler.org/documentation/faq.html#FAQ-whatQuartz

http://blog.csdn.net/gongyouong/article/details/72965451

8.更多讨论

分享到此结束

欢迎大家讨论