Quartz持久化后开发中出现的一个问题
最近来了新同事,开始接手代码,同事拉取的是主分支,主分支比开发分支少了最近加上的两个定时任务。按道理来说不管你本地开发运行的是什么版本,对于测试环境来说都没任何影响。但是,本地开发数据库和测试库是一个库!!!
出现的问题
下午2点例常检查测试服务器日志,定时任务没有今天的错误日志,但是,检查定时任务时发现竟然有一个定时任务状态为 error,于是检查了这个定时任务的代码,发现它只是简单的调用了一个其他工程的接口,当前时间段也没有发生过异常,这就让我很迷惑了,思考了一番,还是没头绪,便把它状态恢复为正常。
傍晚要下班的时候,同事告诉我那个定时任务又双叒叕变成error状态了。于是开始仔细排查:
- 服务器日志 ,error的定时任务并没有错误日志输出,根据它最后一次执行时间查到它调用的接 口也是正常的;
- 恢复出错的定时任务,本地启动定时工程,等了一段时间,错误没有重线;
- 排查所有相关时间段的服务器日志,没发现有什么线索;
- 查看数据库定时任务的执行数据
- 怀疑人生…
解决
版本马上就要上线,不把这个问题解决看来是下不了班了。于是便一个一个的问同事今天有没有修改定时任务,最后了解到有一个新来的同事中午本地启动了一次定时任务,傍晚也本地启动了一次,这就很有问题,看来下班有望啦!
打开同事代码发现分支是master,心里顿时有了数,先恢复定时任务,然后在同事电脑上启动定时任务,等了一段时间,果然报错了,调度器找不到任务,同时定时任务状态又变成error了。一切理顺的我关掉定时任务,顺手切到开发分支更新了同事的代码…
分析
quartz会忽略状态为error的定时任务,定时任务执行出错时会把出错的定时任务状态更新为error。持久化的quartz作为分布式的定时任务,当某个节点的定时任务执行异常后,自动把数据库状态更新为error,其他节点下个执行周期开始忽略当前出错的定时任务。