1.Elastic-Job
Quartz-Misfire什么情况下错过触发?错过触发怎么办?线程池只有5个线程,当有5个任务都在执行的时候,第六个任务即将触发,这个时候任务就不能得到执行。在quartz.properties有一个属性misfireThreshold,用来定义触发器超时的"临界值",也就是超过了这个时间,就算错过触发了。
例如,如果misfireThreshold是60000(60秒),9点整应该执行的任务,9点零1分还没有可用线程执行它,就会超时(misfires)。下面这些原因可能造成misfired job:
1)、没有可用线程
2)、Trigger被暂停
3)、系统重启
4)、禁止并发执行的任务在到达触发时间时,上次执行还没有结束。
错过触发怎么办?Misfire策略设置每一种Trigger都定义了自己的Misfire策略,不同的策略通过不同的方法来设置。standalone工程MisfireTest
大体上来说有3种:
1)、忽略
2)、立即跑一次
3)、下次跑
怎么避免任务错过触发?
合理地设置线程池数量,以及任务触发间隔。
Quartz的不足:
1)、作业只能通过DB抢占随机负载,无法协调
2)、任务不能分片——单个任务数据太多了跑不完,消耗线程,负载不均
3)、作业日志可视化监控、统计
2.Elastic-Job功能特性
分布式调度协调:用ZK实现注册中心
错过执行作业重触发(Misfire)
支持并行调度(任务分片)
作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
弹性扩容缩容:将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片。
失效转移failover:弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能。
支持作业生命周期操作(Listener)
丰富的作业类型(Simple、DataFlow、Script)
Spring整合以及命名空间提供
运维平台