Spring Boot如何实现分布式任务调度?

news2024/11/26 18:52:04

Spring Boot如何实现分布式任务调度?

随着互联网的快速发展,越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下,分布式任务调度变得尤为重要。对于分布式系统中的每个任务来说,它需要在多个节点上定时执行,这样才能保证整个系统的稳定性和可靠性。Spring Boot提供了一些工具和框架,可以帮助我们轻松地实现分布式任务调度。在本文中,我们将深入探讨Spring Boot如何实现分布式任务调度。

在这里插入图片描述

什么是分布式任务调度?

在传统的单体应用中,我们可以很容易地使用定时任务来执行一些周期性的任务,例如数据备份、数据清理等。但是在分布式系统中,我们需要将这些任务分散在多个节点上执行,这些节点可以位于不同的地理位置,甚至由不同的团队管理。在这种情况下,分布式任务调度就成为了必要的组件。

分布式任务调度是指将任务分配给多个节点进行定时执行的过程。通常情况下,任务调度器会从任务队列中取出任务,然后将任务分配给多个节点执行。每个节点会在预定的时间点上执行任务,并将执行结果返回给任务调度器。任务调度器会根据节点返回的结果来决定是否需要重新分配任务或者中断任务的执行。

Spring Boot如何实现分布式任务调度?

Spring Boot提供了一些工具和框架,可以帮助我们实现分布式任务调度。其中,最常用的是Spring Task。Spring Task是Spring框架中的一个轻量级任务调度框架,它可以帮助我们在Spring应用程序中执行定时任务、异步任务等。在分布式系统中,我们可以将Spring Task与其他工具和框架结合起来,实现分布式任务调度。

下面,我们将介绍如何使用Spring Boot、Spring Cloud、Quartz和Redis来实现分布式任务调度。具体实现步骤如下:

步骤一:创建Spring Boot项目

首先,我们需要创建一个Spring Boot项目,并在pom.xml文件中添加必要的依赖。这里我们需要添加以下依赖:

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

这些依赖包含了Spring Cloud、Redis、Quartz等必要的组件和框架。

步骤二:配置Eureka Server

接下来,我们需要配置Eureka Server。Eureka Server是一个服务注册中心,它可以帮助我们管理分布式系统中的各个服务。在Spring Boot中,我们可以使用@EnableEurekaServer注解来启用Eureka Server。我们需要在application.properties文件中添加以下配置:

server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

spring.application.name=eureka-server

这些配置会将应用程序注册为一个Eureka Server,并设置端口号为8761。

步骤三:配置服务提供者

接下来,我们需要配置服务提供者。服务提供者是一个定时执行任务的应用程序,它会将执行结果上传到Redis中。在Spring Boot中,我们可以使用@EnableDiscoveryClient注解来启用服务发现。我们需要在application.properties文件中添加以下配置:

server.port=8081

spring.application.name=task-scheduler-provider

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

这些配置会将应用程序注册为一个服务提供者,并将服务注册到Eureka Server中。

步骤四:配置服务消费者

接下来,我们需要配置服务消费者。服务消费者是一个任务调度器,它会从Redis中获取任务,然后将任务分配给多个节点执行。在Spring Boot中,我们可以使用Ribbon来实现负载均衡。我们需要在application.properties文件中添加以下配置:

server.port=8082

spring.application.name=task-scheduler-consumer

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

这些配置会将应用程序注册为一个服务消费者,并将服务注册到Eureka Server中。

步骤五:配置Redis

接下来,我们需要配置Redis。Redis是一个内存数据库,它可以帮助我们存储任务和执行结果。在Spring Boot中,我们可以使用spring-boot-starter-data-redis依赖来连接Redis。我们需要在application.properties文件中添加以下配置:

spring.redis.host=localhost
spring.redis.port=6379

这些配置会将应用程序连接到本地的Redis服务器。

步骤六:实现定时任务

接下来,我们需要实现定时任务。在Spring Boot中,我们可以使用Quartz来实现定时任务。Quartz是一个开源的任务调度框架,它可以帮助我们在分布式系统中实现任务调度。我们需要创建一个Job类来执行定时任务,然后将Job类注册到Quartz中。具体实现如下:

@Component
public class SampleJob implements Job {

    private final Logger logger = LoggerFactory.getLogger(SampleJob.class);

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        logger.info("SampleJob executed at {}", new Date());
        // TODO: 实现定时任务的具体逻辑
    }
}

上面的代码中,我们创建了一个SampleJob类,它实现了Quartz的Job接口。在execute()方法中,我们可以实现具体的定时任务逻辑。这里我们只是简单地打印了一条日志。

接下来,我们需要将SampleJob类注册到Quartz中。我们可以创建一个QuartzConfig类,并在其中配置SampleJob的触发器。具体实现如下:

@Configuration
public class QuartzConfig {

    @Autowired
    private SampleJob sampleJob;

    @Bean
    public JobDetail sampleJobDetail() {
        return JobBuilder.newJob().ofType(sampleJob.getClass())
                .storeDurably()
                .withIdentity("SampleJob")
                .withDescription("Invoke Sample Job service...")
                .build();
    }

    @Bean
    public Trigger sampleJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10) // 每隔10秒执行一次
                .repeatForever();

        return TriggerBuilder.newTrigger()
                .forJob(sampleJobDetail())
                .withIdentity("SampleJobTrigger")
                .withDescription("Sample Job Trigger")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

上面的代码中,我们创建了一个QuartzConfig类,并在其中配置了SampleJob的触发器。这里我们设置了每隔10秒执行一次。

步骤七:实现任务调度器

最后,我们需要实现任务调度器。在Spring Boot中,我们可以使用Spring Task来实现任务调度器。任务调度器会从Redis中获取任务,然后将任务分配给多个节点执行。具体实现如下:

@Component
public class TaskScheduler {

    private final Logger logger = LoggerFactory.getLogger(TaskScheduler.class);

    private final RedisTemplate<String, Object> redisTemplate;

    @Autowired
    public TaskScheduler(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Scheduled(fixedRate = 5000) // 每隔5秒执行一次
    public void scheduleTasks() {
        String task = (String) redisTemplate.opsForList().rightPop("task_queue");
        if (task != null) {
            logger.info("Task {} scheduled at {}", task, new Date());
            // TODO: 将任务分配给多个节点执行
        }
    }
}

上面的代码中,我们创建了一个TaskScheduler类,并使用@Scheduled注解来实现定时任务。在scheduleTasks()方法中,我们从Redis中获取任务,并将任务分配给多个节点执行。这里我们只是简单地打印了一条日志。

至此,我们已经完成了分布式任务调度的实现。我们可以启动Eureka Server、多个服务提供者和服务消费者,并在服务消费者中调用Quartz中注册的SampleJob来触发分布式任务调度。

总结

在本文中,我们深入探讨了Spring Boot如何实现分布式任务调度。我们使用了Spring Task、Spring Cloud、Quartz和Redis等工具和框架,成功地实现了分布式任务调度。这些工具和框架可以帮助我们轻松地管理分布式系统中的任务调度,提高系统的稳定性和可靠性。如果您正在构建一个分布式系统,并需要实现任务调度,那么Spring Boot提供的这些工具和框架一定会对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware虚拟机最新详细安装保姆级教程(2023年新版教程)

VMware最新详细安装保姆级教程&#xff08;2023年新版教程&#xff09; 大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大…

华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

曾经作为程序员的你为什么不当程序员了?现在在做什么?

去年年底&#xff0c;我把老板开了。因为实在干不下去了。 当时正赶着公司的新产品上线&#xff0c;整个团队都在通宵加班改bug&#xff0c;好不容易才在预定时间内上线&#xff0c;我们都想着能够喘口气了&#xff0c;甚至已经约好了今晚的海底捞&#xff0c;想着请大伙儿搓一…

Go中同/异步与锁的应用~~sync包

Go中锁的实现~~sync包 go中sync包中提供了互斥锁; 在前面Go中channel文章中我们使用了time.Sleep()函数使得main函数的Goroutine阻塞至所有协程Goroutine结束,但这并不是一个很好的办法,因为我们实际应用中并不能准确知道协程什么时候结束(这里面要考虑服务器的性能,网络波动以…

日志脱敏之后,无法根据信息快速定位怎么办?

日志脱敏之殇 小明同学在一家金融公司上班&#xff0c;为了满足安全监管要求&#xff0c;最近天天忙着做日志脱敏。 无意间看到了一篇文章金融用户敏感数据如何优雅地实现脱敏&#xff1f; 感觉写的不错&#xff0c;用起来也很方便。 不过日志脱敏之后&#xff0c;新的问题就…

将Parquet文件的数据导入Hive 、JSON文件导入ES

文章目录 将Parquet文件的数据导入Hive查询parquet文件格式编译cli工具查看元数据信息查询抽样数据 创建hive表 数据存储格式采用parquet加载文件 将json数据导入ESES批量导入api原始json文件内容索引结构重组json脚本重组后的json文件bulk api调用 将Parquet文件的数据导入Hiv…

Spring Boot如何实现分布式文件系统

Spring Boot如何实现分布式文件系统 随着数据量的不断增长&#xff0c;单机文件系统已经无法满足大规模数据存储和访问的需求&#xff0c;因此分布式文件系统变得越来越重要。本文将介绍如何使用 Spring Boot 实现分布式文件系统。 1. 分布式文件系统的设计 分布式文件系统是…

【JavaSE】Java基础语法(四十):UDP通信程序

文章目录 1. UDP发送数据2. UDP接收数据【应用】3. UDP通信程序练习【应用】4. UDP三种通讯方式 1. UDP发送数据 Java中的UDP通信 UDP协议是一种不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象&#xff0c;但是这两个 Socket只是发送&#xff0c;接收数据的对…

Doris的一些进阶用法

6.doris进阶 6.1修改表 6.1.1修改表名 示例&#xff1a; 将名为 table1 的表修改为 table2 SQLALTER TABLE table1 RENAME table2; -- 示例 ALTER TABLE aggregate_test RENAME aggregate_test1; 将表 example_table 中名为 rollup1 的 rollup index 修改为 rollup2 SQLA…

V2board 1.6.1 提权漏洞(web缓存投毒)

目录 复现环境&#xff1a; 漏洞产生的原因&#xff1a; 漏洞的利用以及复现&#xff1a; 复现环境&#xff1a; 在gethub中直接拉去docker镜像 vulhub/README.zh-cn.md at master vulhub/vulhub GitHub 漏洞产生的原因&#xff1a; 前端的认证方式与后端并没有进行区分…

【LeetCode热题100】打卡第9天:电话号码的字母组合

文章目录 电话号码的字母组合⛅前言&#x1f512;题目&#x1f511;题解 电话号码的字母组合 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xf…

本地运行 LLAMA GPT-3.5-TURBO开源项目

git&#xff1a; nomic-ai/gpt4all: gpt4all: an ecosystem of open-source chatbots trained on a massive collections of clean assistant data including code, stories and dialogue (github.com) 下载好源码后&#xff0c;的目录结构&#xff1a; 视频中说的 chat 目录…

视图和用户管理

目录 视图基本使用视图规则和限制 用户管理用户用户信息创建用户删除用户修改用户密码 数据库的权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&…

基于Python的接口自动化-构建mock接口服务

引言 Mock 即模拟&#xff0c;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法&#xff0c;其最大的优势就是降级前后端耦合度&#xff0c; 使前端工程师可以不依赖后端返回数据&#xff0c;先开发前…

堆排序及top k 问题

目录 一&#xff1a;堆排序 1.向上调整建堆 2.向下调整建堆 3.向上调整建堆时间复杂度 4.向下调整建堆时间复杂度 二&#xff1a;找 top k 问题 1.造数据 2.进行建堆&#xff0c;查找最大的K个数据 一&#xff1a;堆排序 升序 --- 建大堆 --- 每个父亲节点 > 孩子节…

高德API JS 高德地图获取多个坐标点的中心点

高德API JS 高德地图获取多个坐标点的中心点 一、需求 我需要在地图上展示多个地点&#xff0c;并且展示的同时&#xff0c;地图缩放到合适的大小&#xff0c;要求刚好能显示全部点位&#xff0c;并且边缘留有一部分间隔。 做成如图所示这样。 二、需要用到的 AMap 类库 经…

使用Python绘制6.1儿童节消消乐,素描图,词云图,字符画图,提取轮廓图及蒙太奇效果图

这篇博客将介绍如何使用Python绘制6.1儿童节消消乐&#xff0c;素描图&#xff0c;词云图&#xff0c;字符画图&#xff0c;提取轮廓图及蒙太奇效果图。 使用Python绘制端午dragboat消消乐 美轮美奂的界面效果 1. 效果图 6.1儿童节快乐原始图VS素描图&#xff1a; 素描进阶…

内网穿透-公网ip-方法总结-访问内网服务器-frp-虚拟服务器

文章目录 1.固定IP2.虚拟服务器转发3.IP盒子4.总结 1.固定IP 第一种方式是向三大电信服务商购买专用通道&#xff0c;固定IP&#xff0c;这种方式是最正统&#xff0c;也是各大虚拟服务器服务商采用的方式&#xff0c;宽带带宽有稳定的保障。在访问量不足的前提下&#xff0c;…

anaconda 安装_Linux系统上

安装流程 1 下载安装包 官网 https://www.anaconda.com/download#downloads 2 执行安装 bash Anaconda3-2021.11-Linux-x86_64.sh3 安装过程 一路enteryes&#xff0c;接受licence、指定安装路径和init之后安装完成。 检验anaconda是否安装成功。 conda --version或 con…

【LeetCode】12,整数转罗马数字。 难度等级:中等。易错点:使用 python 字典构建哈希表时要考虑哈希表是否有序

文章目录 一、题目二、我的解法&#xff1a;基于有序哈希表的贪心算法2.1 使用 dict 构建哈希表2.2 使用两个 list / tuple 构建有序哈希表 一、题目 二、我的解法&#xff1a;基于有序哈希表的贪心算法 2.1 使用 dict 构建哈希表 贪心法则&#xff1a;我们每次尽量使用最大的…