quartz集群问题

根据需求,新增一个定时任务,单元测试通过之后,通过本地功能新增调度任务。随后发现一个诡异问题,那就是只执行一次,然后状态成为了error状态。

原因:本地和uat环境共用一个库,quartz被集群,但是因为代码还未发布到uat环境,导致任务在uat执行时报错,所以一定要保证quartz的job在各个环境下代码都是一致的。

通过观察instance_name的记录,可以发现是由服务器节点的实例名加数字组成,这时将instance的地址与集群中每个节点进行对比,可以发现,uat的instance id并不在集群节点中,但是与集群共用一个数据库

总结:

当使用quartz集群模式时,集群中的代码版本不一致,会出现qrtz_triggers中trigger_state的状态变为”error”的情况,是原因,在集群模式下quartz执行调度任务时是根据数据库表中的调度记录来进行的,当执行到有对应代码的节点上,不会出现问题,但是当执行到没有对应代码的节点上,就会变为”error”, 

因此在集群环境下,节点较多的时候使用quartz,需要注意每个节点的代码版本一定要保持一致

相关推荐