解决定时任务在多台服务器上重复执行的问题?

这篇具有很好参考价值的文章主要介绍了解决定时任务在多台服务器上重复执行的问题?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们使用定时任务部署在单台服务器的时候,没有问题

但是当我们使用多台服务器执行这个定时任务的时候,就会对数据产生影响

解决方法:

1、使用redis的过期机制和分布式锁

首先添加依赖:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置redis的信息:

定时任务部署在多个服务器怎么防止重复执行,定时任务,服务器,redis,java

在我们的具体实现业务上:

    @Autowired
    private RedisTemplate redisTemplate;



        /** 定时任务的名称作为key **/
        String key = "QuartzJob";
        /** 设置随机key **/
        String value = UUID.randomUUID().toString().replace("-", "");

        //如果键不存在则新增,存在则不改变已经有的值。(备注:失效时间要大于多台服务器之间的时间差,如果多台服务器时间差大于超时时间,定时任务可能会执行多次)
        Boolean flag = redisTemplate.opsForValue().setIfAbsent(key, value, 20, TimeUnit.SECONDS);
        if (flag != null && flag) {
            log.info("{} 锁定成功,开始处理业务", key);
            /** 此处填写业务逻辑 **/
            /*
             * 业务逻辑处理完毕,释放锁,正常情况下,由于上边 setIfAbsent 已经设置过期时间了,
             * 所以在规定时间内,Redis 会自动删除过期的 key,但是这个删除由于不确实是什么删除策略,
             * 所以最后执行完再删除一遍比较保险。
             */
            String lockValue = (String) redisTemplate.opsForValue().get(key);
            /** 只有:值未被释放(也就是当前未达到过期时间),且是自己加锁设置的值(不要释放别人的所),这种情况下才会释放锁 **/
            if (lockValue != null && lockValue.equals(value)) {
                redisTemplate.delete(key);
                log.info("{} 解锁成功,结束处理业务", key);
            }
        } else {
            log.info("{} 获取锁失败", key);
        }

该方法比较推荐,简单,对业务逻辑的改变也会少很多,只需要在原来的定时器上加上简单判断即可

2、指定一个服务才能使用定时任务

在配置文件中放一个开关,然后在启动项目时,spring会自动加载这个定时任务类,通过类上的注解判断是否加载该实例,如果不加载,就不会执行定时任务

定时任务部署在多个服务器怎么防止重复执行,定时任务,服务器,redis,java

定时任务部署在多个服务器怎么防止重复执行,定时任务,服务器,redis,java

havingValue中的内容和配置类中的相同的话就执行,否则不执行。文章来源地址https://www.toymoban.com/news/detail-533746.html

到了这里,关于解决定时任务在多台服务器上重复执行的问题?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(62)
  • 通过定时任务+sh脚本方式实现服务器日志文件异机备份

    等保要求服务器A日志(服务器、数据库、后端、nginx、redis等)备份在另外一台服务器B上 通过定时任务+sh脚本+scp命令,实现定时执行脚本,将文件备份到另外一台服务器上 step1、准备工作 服务器A ipA 服务器B ipB step2、脚本命令backup.sh 服务器A上,以nginx日志为例 step3、配对秘钥

    2024年02月16日
    浏览(32)
  • Nginx多台服务器负载均衡

    一 操作步骤: 1.服务器IP 45.114.124.215   //主服务器(安装Nginx) 45.114.124.99     //从服务器(安装Nginx或Apache都可以) 2.保证2台服务器网络互通 3.在2台服务器上设置不同页面方便验证         3.1在主服务器添加一个可以访问的站点          3.2在次服务器添加一个站点,端口必

    2024年02月10日
    浏览(96)
  • centos7系统下,实现1台服务器免密登录多台服务器功能

    1:检查每台服务器是否都安装了SSH: 2:在kafka01服务器上执行:(一直按回车即可!) 3:查看kafka01的.ssh目录: id_rsa (私钥) id_rsa.pub (公钥) 4:在kafka01服务器上执行如下命令,将公钥传给kafka02服务器,实现kafka01能够免密登录kafka02: 然后中途需要我们输入kafka02的密码,

    2024年02月08日
    浏览(50)
  • vscode 配置ssh 免密登录 多台服务器

    Visual Studio Code - Code Editing. Redefined 之前一直用pycharm 但是好像社区免费版本不能连接服务器,还要本地同步代码,比较繁琐,因此改用vscode。 添加后可以尝试登录,确认下账号密码,vpn是否正常 ssh name@ip -22 输入密码即可 win+r 打开运行 cmd 弹出terminal ssh-keygen 三次回车 默认地

    2024年02月17日
    浏览(48)
  • jenkins同一jar包部署到多台服务器

    没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲 jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 Publish Over SSH 这里是已经安装过了 设置流程 添加 Send files or execute commands over SSH , 如果觉得突然到这里很懵的

    2024年02月12日
    浏览(53)
  • FRP 进行内网穿透,在一台客户端上配置多台服务器连接,winsw 配置多个 windows 自启动服务,Windows 远程桌面连接时目标客户端断开 WIFI连接解决办法

    本篇博客建立在已经使用 FRP 实现通过一台服务器范围一台客户端的基础上,不会从头开始对如何配置 FRP 实现内网穿透进行介绍。有需要这方面的同学可以参考下面这篇文章:【计算机网络相关】内网穿透介绍以及使用FRP实现内网穿透Windows远程桌面_frp内网穿透-CSDN博客 本篇

    2024年02月01日
    浏览(50)
  • jenkins如何同一jar包部署到多台服务器

    没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲 jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 Publish Over SSH 这里是已经安装过了 设置流程 添加 Send files or execute commands over SSH , 如果觉得突然到这里很懵的

    2024年02月10日
    浏览(43)
  • 使用EasyDarwin + ffmpeg 搭建流媒体服务器,实现多台智能电视同步播放宣传视频

    近期单位用户提出需求,需要在单位内部的9台安卓智能电视(小米电视)上同步播放用户提供的宣传视频,希望能够做到所有电视音视频同步播放(电视均位于食堂内部,使用内置扬声器,各电视间音频延迟不同会导致混响) 。 由于电视在安装时只预留了电源线,使用HDM

    2024年02月10日
    浏览(51)
  • 2步轻松实现ASP.NET Core托管服务执行定时任务

    最近接到一个新项目,需要在项目里添加一个后台任务,定时去发邮件通知客户;由于是一个比较小型的项目,不希望引入Quartz.Net、Hangfire等太重的框架,同时也没持久化要;寻觅了一下发现ASP.NET Core本身带有托管服务,可以执行定时任务。ASP.NET Core提供了IHostedService接口,

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包