开发者社区> 问答> 正文

Spring使用@Scheduled进行定时任务,集群环境下如何保证只执行一个?

Spring使用注释@Scheduled进行定期任务执行,在单个Tomcat下,是Ok的,一旦在集群环境下,就会执行多次的定时任务。

  如果使用单个数据库,可能增加作任务状态表T。在每个Tomcat启动时,检查任务表T的执行状态,已执行则跳过,未执行则启动任务。在Tomcat关闭时,置任务状态表的执行状态为0。但是一旦发生Tomcat异常关闭,有可能发生任务状态表 的执行状态一直为 1 。

展开
收起
a123456678 2016-03-16 15:30:35 23385 0
2 条回答
写回答
取消 提交回答
  • 这属于分布式环境下的状态同步问题,解决办法就是找一个单点记录状态信息,如你描述中的使用DB进行单点状态记录,Zookeeper也可以作为单点记录状态。思路很简单:在任务执行前读取DB,看下当前任务是否已经在其他节点上执行,如果没有,那么在DB中将执行状态改为执行中,当执行完毕后将任务执行状态改为已经结束。为了防止Tomcat 宕机导致的DB中状态未及时更新,可以增加一个开始执行时间字段,如果过了一段时间后依旧未更新为执行结束,那么可以认为执行该任务的Tomcat出现了异常情况。另外,如果使用ZK来记录状态的话,可以使用一种类型为Ephamal的类型来记录状态。

    2019-07-17 19:04:01
    赞同 展开评论 打赏
  • 给这个定时任务的执行方法前加上一个配置文件的参数判断,集群中的N个server分别判断各自应用下的properties文件中的状态是开还是关。建一个servlet或action,该链接可以通过指定参数来开启或关闭定时任务的开发。发布后,通过指定IP的server访问该应用的url,开启一个应用下的开关即可。开即执行,关即跳过。

    2019-07-17 19:04:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载