http://blog.itpub.net/11627468/viewspace-1763389/
一、引入
你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用Java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。
旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。
二、为什么研发团队会选择quartz
- java编写的开源作业调度框架设计,用于J2SE和J2EE应用方便集成。
- 资历够老,创立于1998年,比struts1还早,而且一直在更新(24 Sept 2013: Quartz 2.2.1 Released),文档齐全。
- 设计清晰简单:核心概念scheduler,trigger,job,jobDetail,listener,calendar
- 支持集群:org.quartz.jobStore.isClustered 最重要的一点原因是quartz是支持集群的。不然JDK自带Timer就可以实现相同的功能。
- 支持任务恢复:requestsRecovery
- 普及面很广,JAVA开发人员比较熟悉。
- Apache2.0开源协议,允许代码修改,再商业发布。
三、quartz集群
关于quartz集群网上文章介绍很多,拿一张常见的图来说明。
- Quartz集群中的每个节点是一个独立的Quartz应用,它又管理其它的节点。
- 需要分别对每个节点分别启动或停止。不像应用服务器的集群,独立的Quartz节点并不与另一个节点或是管理节点通信。
- Quartz应用是通过数据库表来感知到另一应用。
- Quartz应用定时15秒同步一次心跳到数据库。
- Quartz通过数据库行锁来解决分布式环境下数据一致性问题。
Quartz官网: http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-11
问题:由于Quartz的集群基于对表进行行锁,Quartz内部的DB操作大量Trigger存在严重竞争问题,瞬间大量trigger执行。
答:目前只能通过(org.quartz.jobStore.tablePrefix = QRTZ)分表操作,存在长时间lock_wait(新版本据说有提高)。Quartz2.x已经支持可选节点执行job,需要测试Spring最新版本是否支持Quartz的集成。
关于锁的机制,后续文章会对quartz源码进行分析。四、如何使定时任务的开发方便,易于管理。
阿里开源项目easySchedule在quartz集群的基础上搭建了一个简单的管理平台。解决了可视化、易配置、统一监控告警功能。
实现调度与执行的分离,使任务不需要再去关注定时,只需要实现任务接口即可。
调度通过HTTP来调用执行任务。
easySchedule系统特点:
1、 Server和Client分别支持集群和分布式部署
2、 任务的执行与调度分离
3、 可视化管理所有任务
4、 任务状态持久化于DB
5、 完善的日志跟踪和告警策略
6、 任务支持异步调度
7、 灵活支持各种自定义任务,扩展方便