当前位置: 首页 > article >正文

分布式定时任务解决方案(redis版)

需求

当我们项目在服务器上部署了多个节点时我们期望只能有一个节点开跑

解决方案

目前有很多的方案,比如用xxljob等定时任务框架,但如果是小项目,也不想搭那么多服务,毕竟服务多维护成本也高,应该怎么弄呢?

以下方案基于springboot+redis

1. 引入redisson

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.17.5</version>
</dependency>

2. 写RedissonConfig bean

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {  
    
  @Value("${spring.redis.host}")
  private String redisHost;  
  
  @Value("${spring.redis.port}")  
  private int redisPort;

  @Value("${spring.redis.password}")
  private String redisPassword;
  
  @Bean
  public RedissonClient redissonClient() {
    Config config = new Config();
    config.useSingleServer().setAddress(String.format("redis://%s:%d", redisHost, redisPort)).setPassword(redisPassword);
    return Redisson.create(config);
  }  
}

3. 启动定时任务时增加获取锁逻辑

RedissonClient redissonCache = SpringUtils.getBean(RedissonClient.class);
        String key = "jobName: " + job.getJobName();
        //定时任务执行周期较短,为防止数据重复修改,加入锁
        RLock lock = redissonCache.getLock(key);
        try {
            // 执行任务
            log.info("任务准备执行,尝试获取锁 - 名称:{} 方法:{}", job.getJobName(), job.getMethodName());

            // 尝试获取锁并设定锁的过期时间
            boolean acquired = false;
            try {
                acquired = lock.tryLock(0, LOCK_KEY_TIME, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                log.info("tryLock异常", e);
            }
            if (acquired) {
                log.info("任务获取锁成功,开始执行 - 名称:{} 方法:{}", job.getJobName(), job.getMethodName());
                // todo 此处写定时任务执行方法
            }
        }catch (Exception e) {
            log.info("任务执行失败 - 名称:{} 方法:{}", job.getJobName(), job.getMethodName());
            log.error("任务执行异常  - :", e);
        } finally {
            // 释放锁
            try {
                log.info("准备释放锁 - 名称:{} 方法:{}", job.getJobName(), job.getMethodName());
                lock.unlock();
                log.info("释放锁成功 - 名称:{} 方法:{}", job.getJobName(), job.getMethodName());
            }catch (Exception e){
            }
        }

http://www.kler.cn/a/429461.html

相关文章:

  • ImageSharp图形库学习
  • 【Vue3 入门到实战】3. ref 和 reactive区别和适用场景
  • 【力扣Hot100】滑动窗口
  • (一)QSQLite3库简介
  • 如何使用 Excel 进行多元回归分析?
  • 每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能
  • 视频自定义全屏功能——兼容安卓和ios
  • TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
  • 前端成长之路:HTML(1)
  • 【前端】理解 JavaScript 对象属性访问的复杂性
  • 数据结构——图(遍历,最小生成树,最短路径)
  • 基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录
  • mtcnn+facenet+svm实现人脸识别系统
  • 头歌答案--爬虫实战
  • .NET Framework修复工具
  • Conda 虚拟环境,共用一个还是各用各的?
  • superset 配置Connect a database
  • golang 汉字转拼音
  • java+ssm+mysql商品管理系统
  • FreeFileSync文件夹比较同步v13.9
  • 【Unity】【VR开发】摩托车游戏开发笔记1-摩托车手把旋转时轴位移问题
  • 1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)
  • QtCreator UI界面 菜单栏无法输入中文
  • 基于 AutoFlow 快速搭建基于 TiDB 向量搜索的本地知识库问答机器人
  • C# Winform 小鸟过管道小游戏源码
  • ArcGIS10.8安装教程