分布式定时任务重复执行记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26917447/article/details/88226999

背景: 一个项目拆分了几个可单独运行的模块。
A模块中的定时器每个30s去执行一次任务,A模块中的定时器每个30s去执行一次任务(任务内容是远程获取消息并处理发送)。原定是A模块部署到两个服务器,同时建立了数据库表作为分布式锁。但是目前A模块独立运行两个之后总是会获取到相同的远程消息,然后重复执行处理了两次。
技术: 原本是在ssm框架下的定时任务是没有出现重复执行的情况,现在迁移到了springboot之后分布式锁好像没起作用。都是用的spring-scheldue.

改变内容:
原本ssm下的定时任务都是通过xml统一配置,线程池管理。迁移后定时器使用了注解@Scheduled(cron="…");配置了ScheldueConfigure类加入了线程池@Bean。表仍然是method_lock。

原本目的: 通过数据库表能让两个模块的定时任务经过30s的间隔去获取远程消息(因为远程消息的内容30s会变动一次),这样两个模块获取的任务都不相同。

但现在的情况个人感觉像是两个模块的定时任务是同时去访问methd_lock表,然后同时满足30s后获得锁,然后在同时去获取远程消息。

查询的分布式锁解决方法:

  1. 改用quartz,支持分布式(pass)
  2. 改用redis, 设置key的失效时间(pass)
  3. 改用zookeeper, 通过节点判断(待定)
  4. 数据库的服务器与程序运行的机器时间可能有差异(有差异纠正到3s误差内,一段时间后仍出现重复执行)
  5. 从数据库的排它锁开始下手

等问题解决后再来记录结果。
经过两天的排查和测试目前模块运行正常:

  1. 增加了事务管理代码和注解
  2. 在原本的查询语句加入了connection.setAutoCommit(false);

猜你喜欢

转载自blog.csdn.net/qq_26917447/article/details/88226999
今日推荐