首页 > 编程语言 >Java使用分布式锁来做分布式任务调度

Java使用分布式锁来做分布式任务调度

时间:2024-07-03 14:58:15浏览次数:20  
标签:锁来 stmt taskData jedis ex 任务调度 conn 分布式

步骤如下:

1)  选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。

2)  获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;否则说明已经有其他客户端正在处理该请求,此时可以直接返回或者等待一段时间后再次尝试。

3)  执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在任务调度场景中可以从队列中取出一个待处理任务,并将其标记为已处理状态。

4)  释放分布式锁:在完成所有操作之后,必须及时释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。

以下是一个简单示例代码演示如何使用Java实现基本的任务调度功能:

public class TaskScheduler {
    private static final String LOCK_KEY = "task_lock";

    // Redisson客户端
    private RedissonClient redisson;

    // 初始化方法,在系统启动时执行
    public void init() throws Exception {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        redisson = Redisson.create(config);
        System.out.println("TaskScheduler initialized.");
     }

     // 定期轮询队列并取出待处理任务
     @Scheduled(fixedDelay=1000)
     public void pollQueue(){
         RLock lock = redisson.getLock(LOCK_KEY);
         try{
             if(lock.tryLock()){
                 String taskData = getTaskFromQueue(); 
                 if(taskData != null){
                     processTask(taskData); 
                 }
             }else{
                 throw new RuntimeException("无法获得全局互斥访问权!");
             }
         }finally{
            lock.unlock();
         }
      }

      // 从队列中取出一个待处理任务
      private String getTaskFromQueue(){
          Jedis jedis=null;
          try{
              jedis=getJedisPool().getResource();   //从连接池中获取jedis对象  
              return jedis.rpop("task_queue");       //弹出并删除列表最右边元素, 即FIFO模型。
           }catch(Exception ex){
               throw new RuntimeException(ex.getMessage(),ex);
           }finally{
               releaseJedis(jedis);   //归还jedis对象给连接池 
           }
       }

      // 处理指定数据对应的任务
      private void processTask(String taskData){
          Connection conn=null;
          PreparedStatement stmt=null;
          try{    
              conn=getConnectionFromPool();   //从连接池中获取conn对象  
              stmt=conn.prepareStatement(
                  "UPDATE my_table SET status='processed' WHERE data=?");
              stmt.setString(1,taskData);
              int rowsAffected=stmt.executeUpdate();
           }catch(SQLException ex){
               throw new RuntimeException(ex.getMessage(),ex);
           }finally{
               closeStatement(stmt);   关闭语句对象  
               releaseConnection(conn); 归还conn对象给连接池 
           }
       }
}

标签:锁来,stmt,taskData,jedis,ex,任务调度,conn,分布式
From: https://blog.csdn.net/shangjg03/article/details/140149065

相关文章

  • Redis-分布式锁(基本原理和不同实现方式对比)
    文章目录1、基本原理2、不同实现方式1、基本原理分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路......
  • 【分布式数据仓库Hive】Hive的安装配置及测试
    目录一、数据库MySQL安装1.检查操作系统是否有MySQL安装残留2.删除残留的MySQL安装(使用yum)3.安装MySQL依赖包、客户端和服务器4.MySQL登录账户root设置密码,密码值自定义,这里是‘abc1234’5.启动MySQL服务6.登录MySQL,进入数据库操作提示符7.授权Hive远程登录账户......
  • 分布式锁
    /***设置redis分布式锁**@paramkeyType分布式锁类型*@paramhKey分布式锁键值*@return对象列表*/publicbooleangetRedisTempLock(finalStringkeyType,finalStringhKey,longtempValue){Stringkey=keyT......
  • 关于锁的使用,千万不要踩这个坑!(附带Synchronized详解和ZooKeeper、Redis等分布式锁详解
    1、分布式锁在分布式系统中,我们经常会使用各种锁来保证数据的一致性和并发安全。一些常见的分布式锁实现包括:基于ZooKeeper的分布式锁:使用ZooKeeper节点的特性来实现分布式锁。基于Redis的分布式锁:利用Redis的原子性操作和过期时间特性来实现分布式锁。Redlock算法:由......
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jv
    持续学习&持续更新中…守破离【雷丰阳-谷粒商城】【分布式高级篇-微服务架构篇】【13】压力压测JMeter-性能监控jvisualvm压力测试概述性能指标JMeter基本使用添加线程组添加HTTP请求添加监听器启动压测&查看分析结果JMeterAddressAlreadyinuse错误解决性......
  • 深入理解单一应用架构、垂直应用架构和分布式服务架构
    什么是单一应用架构?单一应用架构(MonolithicArchitecture)是一种传统的软件架构模式,其中所有的功能模块被构建成一个独立的可部署单元。简单来说,整个应用程序作为一个整体被打包和部署。单一应用架构的特点集中管理:所有的功能模块都在一个代码库中进行管理。统一部署:整个......
  • 【2024最新精简版】分布式事物面试篇
    文章目录在你的项目中哪些模块使用了分布式事务控制?能否举例说明?说一说SeatAT模式的工作原理?说一说SeatXA模式的工作原理?说一说SeatTCC模式的工作原理?什么是TCC模式的业务悬挂和空回滚?如何解决业务悬挂和空回滚?更多相关内容可查看在你的项目......
  • 任务调度SpringTask入门
    任务调度简介1.1什么是任务调度在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。常见的任务调度框架有Quartz和SpringTask等。SpringTask入门1.2SpringTask入门小Demo创建模块52xbc-......
  • 力扣-621. 任务调度器
    1.题目题目地址(621.任务调度器-力扣(LeetCode))https://leetcode.cn/problems/task-scheduler/题目描述给你一个用字符数组 tasks表示的CPU需要执行的任务列表,用字母A到Z表示,以及一个冷却时间n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一......
  • Memcached分布式特性解析:高效缓存策略的关键
    在现代的互联网应用中,缓存是提高性能和扩展性的关键技术之一。Memcached作为一个高性能的分布式内存缓存系统,广泛用于减轻数据库负载、加快数据访问速度。本文将深入探讨Memcached的分布式特性,包括其工作原理、集群管理、数据一致性、故障恢复以及与其他分布式系统的集成等......