集群服务器定时任务,只运行一个定时器的设计

Posted day to day

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集群服务器定时任务,只运行一个定时器的设计相关的知识,希望对你有一定的参考价值。

(1)只在一台服务器上部署该定时任务代码。

(2)在定时任务代码上加上某个特定的ip限制,仅某个ip的服务器能运行该定时任务。

(3)利用数据库的共享锁事务管理机制来运行定时任务。

   第一步:新建一张数据库表,表有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。

   第二步:检查是否有机器正在运行定时任务。检查方法:update定时任务表的status字段为1(1为执行中,0为未执行)、ip为自己的ip,如果update失败,则证明有机器在执行该定时任务,该机器的定时任务就不执行了,成功则进行第三步。

   第三步:执行定时任务的具体内容,结束还原excute字段为0。

另外:
  首先,我们先在数据库建一个表:timerT,表里面有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。
      这里其具体的用法是:当两台服务器,都运行起来后,服务器A开始执行定时器,这时,A会去读取表timerT的status字段,当为0时,则执行定时器的业务逻辑,此时A定时器,需要把status改为1,以便让另一台服务器的定时器B不去执行业务逻辑并把当前服务器的IP记录到表中,同时修改启动一个新的线程,在XXX长的时间间隔内不断去修改timestamp的值,当A执行完业务逻辑时,就把status的值改为0,这样B定时器就可以执行。
  这样做可以解决一个问题,就是:当其中一个定时器A挂掉后,我们另一个定时器B,可以比对timestap的值与当前时间是否超过XXX时长,如果超过,则证明定时器A已经挂掉,这时B就会把status的值改成1,把serverIP改成B定时器所在的服务器IP,并执行业务逻辑。

以上是关于集群服务器定时任务,只运行一个定时器的设计的主要内容,如果未能解决你的问题,请参考以下文章

spring quartz定时任务集群环境下如何实现只在单个节点运行

原!总结 quartz集群 定时任务 测试运行ok

定时任务调度系统设计

集群中定时任务的重复执行

动态创建管理定时任务-已完成

如何搭建Devops平台定时任务处理集群