首页 > 其他分享 >使用分布式锁实现定时任务的精确调度

使用分布式锁实现定时任务的精确调度

时间:2023-12-26 16:32:15浏览次数:35  
标签:调度 任务 duration import 定时 annotation 分布式

定时任务,实现分布式控制定时任务

使用分布式锁实现定时任务的精确调度

在分布式系统中,实现定时任务的精确调度是一项具有挑战性的任务。由于分布式环境中存在多个节点,传统的定时任务可能会出现并发执行、重复执行或者错过执行的问题。为了解决这些问题,我们可以使用分布式锁来实现定时任务的精确调度。

准备工作

在开始之前,我们需要准备以下环境和工具:

  • Spring框架
  • Redis作为分布式锁的存储介质

实现步骤

1. 创建自定义注解

首先,我们需要创建一个自定义注解,用于标记需要进行定时任务调度的方法。这个注解可以包含一些属性,用于配置定时任务的执行规则和其他参数。例如,我们可以添加cron属性来指定定时任务的执行时间表达式,以及duration属性来指定预期任务时长。此注解集成Scheduled,使其天然继承Scheduled的特性,使我们不再关系定时触发的细节。

import org.springframework.core.annotation.AliasFor;
import org.springframework.scheduling.annotation.Scheduled;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Scheduled
public @interface DistributedScheduled {

    @AliasFor(annotation = Scheduled.class, attribute = "cron")
    String cron() default "";

    /**
     * 任务持续时长
     */
    String duration() default "";

}

2. 创建切面类

接下来,我们需要创建一个切面类,用于拦截带有DistributedScheduled注解的方法,并实现定时任务的精确调度逻辑。在切面类中,我们可以使用Redis作为分布式锁的存储介质,并使用AOP技术来拦截目标方法。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DistributedScheduledAspect {

    @Autowired
    private RedisFatClient redisFatClient;

    @Around("@annotation(distributedScheduled)")
    public Object executeScheduledTask(ProceedingJoinPoint joinPoint, DistributedScheduled distributedScheduled) {
        String lockKey = joinPoint.getSignature().toLongString().replace(" ", "-");
        RLock lock = null;
        try {
            String duration = distributedScheduled.duration();
            long lockDuration = 30 * 1000;
            if (!duration.isEmpty()) {
                lockDuration = Long.parseLong(duration);
            } 
            lock = redisFatClient.getLock(lockDuration, lockKey);
        
            if (lock.tryLock()) {
                return joinPoint.proceed();
            } else {
                log.warn("lockKey: {}, 抢锁失败,此任务本节点不执行", lockKey);
            }
        } catch (Throwable throwable) {
            log.error("执行定时任务发生异常", throwable);
        } finally {
            if (lock != null && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
        return null;
    }
}

3. 使用自定义注解标记定时任务方法

现在,我们可以在需要进行定时任务调度的方法上使用DistributedScheduled注解来标记。可以根据需要配置cron和duration属性。

@Slf4j
@Component
public class MyScheduledTasks {

    @DistributedScheduled(cron = "0 * * * * ?", duration = "60000")
    public void myScheduledTask() {
        // 执行定时任务的逻辑
    }
}

总结

通过使用分布式锁和AOP技术,我们可以实现定时任务的精确调度。自定义注解可以灵活地配置定时任务的执行规则和参数,切面类则负责拦截目标方法并实现分布式锁的逻辑。这样,我们就能够在分布式环境中安全、可靠地执行定时任务。



标签:调度,任务,duration,import,定时,annotation,分布式
From: https://blog.51cto.com/chengluchao/8984775

相关文章

  • 分布式架构的高性能与可用性
    分布式架构是一种将系统拆分为多个独立的组件或服务,并在不同的计算节点上部署这些组件或服务的架构方式。它可以提供高性能和可用性的好处。下面我将详细介绍分布式架构在高性能和可用性方面的优势。高性能横向扩展:分布式架构可以通过增加计算节点来实现横向扩展,从而提高系统......
  • linux下服务器ping不通公网域名(不定时更新)
    1、服务器开通的公网访问,但是ping不通域名,可配置hosts重试保存后,重试,OK2、服务器公网IP也ping不通,修改网卡配置,配置DNS重启网卡后,问题解决......
  • GaussDB(DWS)中的分布式死锁问题实践
    本文分享自华为云社区《GaussDB(DWS)中的分布式死锁问题实践》,作者:他强由他强。1、什么是分布式死锁分布式死锁是相对于单机死锁而言,一个事务块中的语句,可能会分散在集群里多个节点(CN/DN)执行,在不同节点上可能都会持有锁,当并发事务进行时可能会导致分布式(全局)死锁,如下图所示,会话SE......
  • FreeRTOS调度
    FreeRTOS调度器是其核心组件之一,负责管理和调度系统中的多个任务。以下是对FreeRTOS调度器的原理和使用方法的深度解析:原理:任务创建:使用xTaskCreate()函数创建任务,该函数需要指定任务函数、任务名称、堆栈大小、优先级和其他参数。每个任务都有自己的堆栈空间和优先级。优先级调度......
  • 使用 PostgreSQL 16.1 + Citus 12.1 作为多个微服务的分布式 Sharding 存储后端
    在本教程中,我们将使用PostgreSQL16.1+Citus12.1作为多个微服务的存储后端,演示此类集群的样例设置和基本操作。Citus12.1实验环境设置Docker快速启动Citus分布式集群docker-compose.ymlversion:"3"services:master:container_name:"${COMPOSE_PROJECT......
  • 进程调度算法--引阿秀学习笔记
    1.先来先服务First-comeFirst-serverd(FCFS)按照请求顺序进行调度,利于长作业,不利短作业,短作业等待前面长作业执行完毕才可执行,造成短作业等待时间长。2.短作业优先shortestjobfirst(SJF)按估计运行时间最短的作业顺序进行调度,长作业可能会饿死(假如一直有短作业到来)3.......
  • [CSS]border-image-slice宽高不确定时自定义边框
    宽高不确定时自定义边框效果: <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>borde......
  • 分布式协议详解
    目录1.分布式理论1.1拜占庭将军问题1.2CAP理论1.3BASE理论2.分布式算法协议3.分布式事务协议3.12PC3.23PC3.3TCC3.4本地事务表3.5MQ事务消息3.6最大努力通知1.分布式理论1.1拜占庭将军问题1.2CAP理论1.3BASE理论2.分布式算法协议3.分布式事务协议参考七......
  • Redis分布式锁
    1.分布式锁的方案分类方案原理优点缺点基于数据库mysql数据库表的唯一索引1.表创建唯一索引2.加锁:执行insert语句,成功则加锁成功,失败则加锁失败3.解锁:执行delete语句完全利用DB实现,实现简单1.锁无超时自动失效机制,有死锁风险2.不支持锁冲入,不支持阻塞等待3.操作数据......
  • AI分布式训练:DDP (数据并行)技术详解与实战
    分布式训练:DDP(数据并行)技术详解与实战一、背景介绍什么是AI分布式训练分布式训练作为一种高效的训练方法,在机器学习领域中得到了广泛的应用和关注。而其中的一种技术,就是数据并行(DDP)。在本节中,我们将详细介绍什么是AI分布式训练,并重点讨论了数据并行技术的原理和实施方式。我们将......