java 分布式 定时任务_Java中实现分布式定时任务的方法

article/2025/10/10 2:17:12

定时器Scheduler在平时使用比较频繁,在springboot中,配置好@Scheduled和@EnableScheduling之后,定时器就能正常执行,实现定时任务的功能。

但是在这样的情况下:如果开发的服务需要水平部署实现负载均衡,那么定时任务就会同时在多个服务实例上运行,那么一方面,可能由于定时任务的逻辑处理需要访问公共资源从而造成并发问题;另一方面,就算没有并发问题,那么一个同样的任务多个服务实例同时执行,也会造成资源的浪费。因此需要一种机制来保证多个服务实例之间的定时任务正常、合理地执行。

本文以shedlock为例,来实现分布式定时任务的控制。

ShedLock可以保证多个同样的定时任务在多个服务实例之间最多只执行一次,是一个在分布式环境中保证定时任务合理执行的框架,我们可以叫它分布式定时任务锁。

ShedLock的实现原理是采用公共存储实现的锁机制,使得同一时间点只有第一个执行定时任务的服务实例能执行成功,并在公共存储中存储"我正在执行任务,从什么时候(预计)执行到什么时候",其他服务实例执行时如果发现任务正在执行,则直接跳过本次执行,从而保证同一时间一个任务只被执行一次。

ShedLock的公共存储目前支持的有:MonogoDynamoDBJdbcTemplateZooKeeper (using Curator)Redis (using Spring RedisConnectionFactory)Redis (using Jedis)Hazelcast第一步引入依赖

net.javacrumbs.shedlock

shedlock-spring

4.11.1

net.javacrumbs.shedlock

shedlock-provider-jdbc-template

4.11.1

第二步添加配置类

import net.javacrumbs.shedlock.core.LockProvider;

import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;

import javax.sql.DataSource;

import java.util.TimeZone;

/**

* @descrition shedlock配置类

* @since 2021-01-10 22:39

*/

@Configuration

public class ShedLockConfig {

@Resource

private DataSource dataSource;

/**

* @description

* @date 2021/1/10 22:39

*/

@Bean

public LockProvider lockProvider() {

return new JdbcTemplateLockProvider(

JdbcTemplateLockProvider.Configuration.builder()

.withJdbcTemplate(new JdbcTemplate(dataSource))

.withTimeZone(TimeZone.getTimeZone("GMT+8"))

.build()

);

}

}

第三步,添加公共存储,前面我们说过shedlock支持多种公共存储作为锁,本文我们以mysql为例

CREATE TABLE shedlock (

NAME VARCHAR ( 64 ) NOT NULL,

lock_until TIMESTAMP ( 3 ) NOT NULL,

locked_at TIMESTAMP ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3 ),

locked_by VARCHAR ( 255 ) NOT NULL,

PRIMARY KEY ( NAME )

);

第四步,添加具体任务类

import lombok.extern.slf4j.Slf4j;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

* @author shane

* @date 2021/1/10 23:39

*/

@Slf4j

@Component

public class TestJob {

/**

* @description 每隔1min打印一次

* @date 2021/1/10 23:39

*/

@Scheduled(cron = "0 0/1 * * * ?")

// lockAtMostFor为锁默认持有时间,会覆盖启动类中的默认持有时间

@SchedulerLock(name = "demo", lockAtMostFor = "70m")

public void print() throws InterruptedException {

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

log.warn("当前时间:"+df.format(new Date()));

}

}

接着,我们复制一份代码,分别启动两个实例来看结果

ce9fa72b42a3b8d49bcc1de50ece2876.png

98c501937ce0d9bf933064d470f7be63.png数据库记录

202101110825003.png@SchedulerLock注解参数说明name:定时任务的名字,就是数据库中的内个主键

lockAtMostFor:锁的最大时间单位为毫秒

lockAtLeastFor:锁的最小时间单位为毫秒

对了,还有启动类的配置

@SpringBootApplication

@MapperScan("com.example.test.mapper")

@EnableScheduling

@EnableSchedulerLock(defaultLockAtMostFor = "10m") // 默认的锁的时间

public class TestApplication {

public static void main(String[] args) {

SpringApplication.run(TestApplication.class, args);

}

}

参考出处:

https://www.jianshu.com/p/941416645606

到此这篇关于Java中实现分布式定时任务的方法的文章就介绍到这了,更多相关java分布式定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


http://chatgpt.dhexx.cn/article/638qFaws.shtml

相关文章

【手把手】分布式定时任务调度解析之Quartz

1、任务调度背景 在业务系统中有很多这样的场景: 1、账单日或者还款日上午 10 点,给每个信用卡客户发送账单通知,还款通知。如何判断客户的账单日、还款日,完成通知的发送? 2、银行业务系统,夜间要完成跑批…

轻量级分布式定时任务框架XXL-Job

轻量级分布式定时任务框架XXL-Job: XXL-JOB是一款轻量级的分布式定时任务框架,上手简单,操作容易,XXL-Job可以到官网下载也可以去gitee上拉取源码,其中核心模块分页两个:1:是分布式调度服务, 2&…

Springboot结合Redis实现分布式定时任务

一、背景 之前分享过分布式定时任务的技术选型方案:分布式定时任务技术选型方案,个人青睐xxl_job,分享了搭建接入流程:xxl_job搭建方案,本次项目需求较为简单,同时时间紧张。下面介绍利用Redis锁实现分布式…

分布式定时任务框架说明

分布式定时任务框架说明 分布式定时任务框架说明Quartz概念架构组件springboot集成方式使用内存使用数据库 TBSchedule:elastic-job概念架构组件执行流程特性 satumxxl-job概念特性架构组件使用 分布式定时任务框架说明 Quartz 概念 Quartz:Java事实上…

分布式定时任务对比

1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job ,quartz , saturn, opencron , antares el…

简单粗暴的分布式定时任务解决方案

分布式定时任务 1.为什么需要定时任务?2.数据库实现分布式定时任务3.基于redis实现 1.为什么需要定时任务? 因为有时候我们需要定时的执行一些操作,比如业务中产生的一些临时文件,临时文件不能立即删除,因为不清楚用户…

Java 实现分布式定时任务

文章目录 前言一、技术点二、代码实践1、引入库2、创建启动线程入口3、表结构4、任务解析5、任务拉取 三、结果展示四、总结 前言 最近有一个需求:需要实现分布式定时任务。而市面上的定时任务大多数都是基于Scheduled注解进行实现。不符合需求。所以根据需求整体思…

分布式定时任务调度

前言 什么是分布式定时任务? 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 为什么要采用分布式定时任务? 单点定时任务的缺点: 功能相对简单&#xff0c…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案…

几种常用的分布式定时任务

1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job quartz saturn opencron antares elastic-job el…

分布式定时任务

分布式定时任务 1,什么是分布式定时任务;2,为什么要采用分布式定时任务;3,怎么样设计实现一个分布式定时任务;4,当前比较流行的分布式定时任务框架; 1,什么是分布式定时…

python类型转换函数str

str函数,将数字转为字符串:

Python 类型转换(数据类型转换函数大全)

文章目录 虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换。 比如说,我们想通过使用 print() 函数输出信息“您的身高:”以及浮点…

python怎么转换文件格式_python怎么转换数据类型

在处理数据的时候,经常需要转换数据的格式,来方便数据遍历等操作。下面我们来看一下Python中的几种数据类型转换。 1、字符串转字典:dict_string "{name:linux,age:18}" to_dict eval(dict_string) print(type(to_dict)) 也可以用…

python强制类型转换

1.强转为int string->int a string print(int(a))a 1.2 print(int(a))a 12 print(int(a))string仅在无特殊字符(包括小数点)且全为数字的情况下可强转为float boolen->int a True b False print(int(a)) print(int(b))float->int a …

python批量转换数据类型_python中数据类型转换

1、list转str 假设有一个名为test_list的list,转换后的str名为test_str 则转换方法: test_str = "".join(test_list) 例子: 需要注意的是该方法需要list中的元素为字符型,若是整型,则需要先转换为字符型后再转为str类型。 2、str转list 假设有一个名为test_str的…

python类型转换

一、int——支持转换为 int 类型的,仅有 float、str、bytes,其他类型均不支持。 1、str与bytes类型是什么,有什么区别 文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。 字符串是 以字符为单位进行处理…

浅谈Python中的类型转换

目录 (一)前言 (二)四种常见转换类型 1. int()函数 (1)int()函数的格式 (2)示例 2. float()函数 (1)float()函数格式: (2&…

初学ansys:模态分析及谐响应分析

谐响应为线性系统对简谐激励的稳态响应,当系统含有阻尼或者激励为复数(相位不为0或pi),谐响应为复数。 ansys可在模态分析的基础上进行谐响应分析: 2阶频率377.47,振型如下: 当z向加速度10g,右端平面z向位…