由于项目原因,需要使用分布式定时任务。目前可以使用的定时任务框架包括:
A)Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能。
B)TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重。
C)Crontab:Linux系统级的定时任务执行器。缺乏分布式和集中管理功能。
综上所述,当前存在的作业系统缺少分布式、并行调度、弹性扩容缩容、集中管理、定制化流程型任务等功能,所以需要一个新的作业系统完善这些功能。
当当近期开源了分布式作业调度框架elastic-job项目,项目开源地址:https://github.com/dangdangdotcom/elastic-job
elastic-job可以从下面的几个类开始入手:
JobScheduler:作业调度器,简单说就是进行作业调度的管理容器。里面会管理作业的基本配置,注册,选举,分片,失效转移等核心逻辑实现;
ListenerManager:监听管理,对作业的各种状态进行监听,包括选举,分片,失效,操作,配置变更等事件监听,触发相应的执行逻辑;
AbstractElasticJob:作业的基类,目前作业分为3种,简单类型,流式作业,流式顺序作业。
关于elastic-job的详情说明请参见:http://www.chinacloud.cn/show.aspx?id=22237&cid=16
http://www.infoq.com/cn/articles/dangdang-distributed-work-framework-elastic-job