最近用到定时任务,业务场景需要支持分布式,虽然Elastic-Job已经停更,但基本满足需求,且该框架已经经过多个厂家生产验证,撸了把源码也感觉框架较轻量容易把控一些,因此基于Elastic-Job-lite实现定时任务
几个痛点
- 存在手动触发任务的场景(虽然后来暂时没有通过此方式实现,本文如果有任何存在漏洞的地方,欢迎拍砖),但是Elastic-Job不支持
- 希望手动触发的任务仍然可以借助Elastic-Job弹性机制(失效转移和分片机制)
- 手动触发任务可能是一次性的,即希望在某个任务执行完毕后再触发相关任务的执行,也就是任务之间存在依赖关系
- 希望实时看到任务的处理情况,也就是elastic-job-lite-console做的事,但是elastic-job-lite-console需要单独部署直连zookeeper,zookeeper可能在内网,当然也可以把console部署在内网,这样会增加一些维护的麻烦
做了哪些事
- 增加任务注解ScheduledTask,减少开发工作量,开发同学只需要增加注解配置即可,也支持将任务配置提升到application.yml等配置文件中,配置文件优先级最高
- 支持手动增加定时任务(如定时任务在1分钟后启动),通过所有分布式节点增加zookeeper namespace监听,namespace增加和删除job结点时与本jvm运行JobRegistry比对,决定是否增删job
- 支持任务仅执行一次,在job parameter中增加runOnce参数,在AbstractDistributeOnceElasticJobListener中监听任务执行情况,当任务所有分片执行完毕后,删除zookeeper job结点,关闭本jvm job及job listener(防止线程数不断攀升)
- 自定义exceptionhandler,方便增加适合于自身业务的日志告警
- 将elastic-job-lite-console融合到本工程,因为console自带鉴权机制较弱,建议定时任务工程需要通过https访问,或者修改鉴权机制
- 增加了一个任务监听告警机制,如果任务在cron规定时间没有启动则报警,感觉这个比较鸡肋,可以通过参数关闭
历史文章:
网友评论