1.cron4j好像不支持按秒执行?
2.cron4j集群时候的问题,我看到波总在回答别人帖子的时候给过这样一个解决方案
1:将 task 创建与 task 调度分开
2:创建 task 时,向一个集中的数据库表写入记录,假定就叫 task 表
3:task 表中放一个 int lock 字段,用来在分布式环境下来上锁
4:集群中的 taks 调度程序在事务中为将要处理的 task 记录的 lock 字段上锁,置为 1,然后开始处理,其它调度程序在调度的时候发现 lock 为 1 时不处理
这里再建议两个小设计:
1:创建一个 status 字段表明处理状态,根据需求值可以是:0初始、1正处理、2成功、3失败
2:基于 Cron4j 的调度程序在最开始一段代码前面,加一句 Thread.sleep(随机数毫秒数); 这个随机的毫秒数可用 new Random().nextInt(2000); 这样的代码来生成。这样做的好处是避免集群环境下多个使用同样 cron 表达式的线程过于竞争
问题:
1:将 task 创建与 task 调度分开
这个的话我看现在的jfinal中Cron4jPlugin里面是直接加到config的plugins里面后直接strat,那么我如果想做创建和调度分开是不是就得自己重新实现一遍Cron4jPlugin里AddTask的操作,再把start的单独拆出来
2:在表中或者redis中给任务加lock和state
这个确实能解决集群重复调度task的问题,但是他的生命周期怎么管理,比如我一个任务需要5分钟执行一次,我跑过一次后他现在Lock的状态是1,state是已完成,我不知道什么时候把他lock重置,那么之后第二次我再去调用的时候发现是被锁住的我只有每次都调度不了这个任务了。
其实这边我是不是该记一个时间戳,我上次运行的时间戳,如果说我这次任务当前运行的时间戳>我上次运行的时间戳的时候才让执行,lock的话在执行完task后就重置状态,因为有时间戳的关系如果集群重复时间的任务不会被调度
task 集群调度就看大家各显神通了,将状态、同步这类事情处理好