quartz 是强大的任务调度库
Quartz是开源的任务调度Java库。功能丰富,可以集成到小到单机应用,大到电子商务系统的任何Java应用中。
Quartz能做什么?
如果应用需要在某一个时刻执行一个任务,或者系统需要经常性进行的维护工作,那么Quartz是不错的解决方案。 使用任务调度的例子:
- 驱动工作流进程:一个新订单初始化后,制定一个2小时后触发的任务,检查订单状态。如果没有收到订单确认消息,则触发一个警告通知,同时改变订单状态。
- 系统维护:制定一个每天将数据库内容转存为xml文件的任务,每天晚上11:30执行。
- 应用中的提醒服务。
主要功能
运行时环境
- Quartz可以嵌入到任何独立应用中运行。
- Quartz可以在一个应用服务器(或servlet容器)实例化,及参与XA事务。
- Quartz可以作为一个独立的程序运行(在自带的JVM中),并通过RMI使用。
- Quartz可以实例化为一组独立的程序(通过负载均衡和故障转移能力)执行Job。
Job调度
当给定的触发器触发Job就会执行,触发器可以通过以下指令的任意组合创建:
- 一天中的某个时刻(精确到毫秒)
- 一周中的几天
- 一个月中的几天
- 一年中的几天
- 日历中的特定时间(例如商务假期)
- 重复特定次数
- 不断重复直到特定的时间/日期
- 无限重复
- 延时重复
Job执行
- Job是实现了简单Job接口的任何Java类。
- Job类实例可以由Quartz或者你的应用框架实例化。
- 当触发器触发,调度程序通知0个或多个实现了JobListener和TriggerListener接口的Java对象(监听器可以是普通Java类、EJB、JMS等)。
- 当作业完成,返回一个JobCompletionCode通知调度成功或失败。
Job持久化
- Quartz包括JobStore接口可以实现作业存储的各种机制。
- 使用JDBCJobStore,所有的作业和触发器配置都通过JDBC存储在关系型数据库中,所以都是“非易失性”。
- 使用RAMJobStore,所有的作业和触发器存在内存中。
事务
- 通过使用JobStoreCMT(JDBCJobStore的子类),Quartz可以加入JTA事务。
- Quartz可以作业执行中管理JTA事务(开始和提交),所以JTA事务中Job会自动执行。
集群功能
- 故障转移。
- 负载均衡。
- Quartz内置的集群功能依赖JDBCJobStore实现数据库持久化。
- Terracotta对Quartz提供了不需要后端数据库的集群能力。
监听器和插件
- 应用可以通过实现一个或多个监听器接口捕获调度事件用于监控job/trigger的行为。
- 插件机制用于向Quartz添加功能,如保存job执行的历史,或从文件加载job和trigger。
- Quartz附带了许多“factory built”插件和监听器。