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
undefined_腾讯视频
谢谢观看
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
网友评论