不会用 SpringBoot 做分布式任务调度?这篇攻略让你轻松上手!

科技   2024-11-14 07:24   浙江  
👇推荐大家关注一个公众号👇
点击上方 "编程技术圈"关注, 星标或置顶一起成长
后台回复“大礼包”有惊喜礼包!

日英文

What is adhere to? Is day, and one day, you tell yourself, insist again one day.

什么是坚持?就是一天,又一天,你告诉自己,再坚持一天。

每日掏心话

不要沉迷过去,不要害怕未来,过去。得失也好,成败也罢,无论快乐,还是痛苦,都过去了,你只能回忆,而无法回去。

责编:乐乐 | 来源:IT·陈寒

链接:ithan.blog.csdn.net/article/details/140258013

编程技术圈(ID:study_tech)第 3033 期推文


往日回顾:ChatGPT 4o 国内直接用!

     

      正文     

大家好,我是小乐

引言

随着互联网应用的规模和复杂度不断增加,单节点任务调度系统已经难以满足高并发、大数据量的处理需求。分布式任务调度成为了解决这一问题的重要手段。

本文将介绍如何在Spring Boot中实现分布式任务调度,探讨其原理、实现方法以及常见问题的解决方案。

一、分布式任务调度的基本原理

分布式任务调度的核心是将任务分配到多个节点上执行,从而提高系统的并发处理能力和可靠性。主要包括以下几个部分:

  • 任务分配: 将任务按照一定规则分配到不同的节点上执行。
  • 任务执行: 各个节点独立执行分配到的任务。
  • 任务协调: 协调各个节点的任务执行情况,处理任务失败、重试等问题。
  • 结果汇总: 收集各个节点的执行结果,进行汇总和处理。

二、Spring Boot与分布式任务调度

Spring Boot是一款简化Spring应用开发的框架,它提供了很多便捷的功能来构建微服务。在Spring Boot中实现分布式任务调度,我们可以借助一些开源框架,如QuartzElastic-Jobxxl-job等。

1. 使用Quartz实现分布式任务调度

Quartz是一个功能强大的任务调度框架,支持分布式调度。以下是使用Quartz实现分布式任务调度的步骤:

1)引入依赖

pom.xml中引入Quartz的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
</dependency>

2)配置Quartz

application.properties中进行配置:

spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=never
spring.quartz.properties.org.quartz.scheduler.instanceName=MyClusteredScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
spring.quartz.properties.org.quartz.jobStore.maxMisfiresToHandleAtATime=1
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=60000
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

3)定义任务

创建一个任务类,实现Job接口:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;

@Component
public class SampleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Executing Sample Job at " + System.currentTimeMillis());
    }
}

4)配置任务调度

通过@Configuration类来配置任务调度:

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail sampleJobDetail() {
        return JobBuilder.newJob(SampleJob.class)
                .withIdentity("sampleJob")
                .storeDurably()
                .build()
;
    }

    @Bean
    public Trigger sampleJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)
                .repeatForever();

        return TriggerBuilder.newTrigger()
                .forJob(sampleJobDetail())
                .withIdentity("sampleTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

2. 使用Elastic-Job实现分布式任务调度

Elastic-Job是当当网开源的一个分布式调度解决方案,具有灵活的分片策略和强大的任务管理能力。

1)引入依赖

pom.xml中引入Elastic-Job的依赖:

<dependency>
    <groupId>org.apache.shardingsphere.elasticjob</groupId>
    <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2)配置Elastic-Job

application.properties中进行配置:

elasticjob.regCenter.serverList=localhost:2181
elasticjob.regCenter.namespace=elasticjob-lite-spring-boot

3)定义任务

创建一个任务类,实现SimpleJob接口:

import org.apache.shardingsphere.elasticjob.api.simple.SimpleJob;
import org.apache.shardingsphere.elasticjob.infra.env.ServerContext;
import org.apache.shardingsphere.elasticjob.infra.schedule.JobConfiguration;
import org.springframework.stereotype.Component;

@Component
public class MyElasticJob implements SimpleJob {
    @Override
    public void execute(ServerContext context) {
        System.out.println("Executing Elastic Job at " + System.currentTimeMillis());
    }
}

4)配置任务调度

通过@Configuration类来配置任务调度:

import org.apache.shardingsphere.elasticjob.infra.schedule.JobConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticJobConfig {

    @Bean
    public JobConfiguration jobConfiguration() {
        return JobConfiguration.newBuilder("myElasticJob"3)
                .cron("0/5 * * * * ?")
                .shardingItemParameters("0=A,1=B,2=C")
                .build();
    }
}

三、常见问题与解决方案

在实现分布式任务调度的过程中,可能会遇到一些常见问题,下面是一些解决方案:

任务重复执行: 在分布式环境中,由于网络延迟或其他原因,可能会导致任务重复执行。可以通过设置任务的唯一标识和状态来避免重复执行。

任务失败重试: 在任务执行过程中,可能会遇到一些临时性错误,需要进行任务失败重试。可以使用任务调度框架提供的重试机制,或者自定义重试逻辑。

任务状态管理: 在分布式环境中,需要对任务的状态进行有效管理,确保任务的执行顺序和状态一致性。可以使用分布式锁或分布式事务来保证任务状态的一致性。

任务调度的监控与报警: 在分布式环境中,需要对任务的执行情况进行监控,并在出现异常时进行报警。可以使用任务调度框架提供的监控功能,或者集成第三方监控工具。

结论

在Spring Boot中实现分布式任务调度,可以大大提高系统的并发处理能力和可靠性。本文介绍了使用Quartz和Elastic-Job两种常见的分布式任务调度框架的实现方法,并提供了一些常见问题的解决方案。

在实际应用中,可以根据具体需求选择合适的任务调度框架,并进行相应的优化和调整。通过合理的任务调度策略和有效的任务管理,可以实现高效、可靠的分布式任务调度系统。


你还有什么想要补充的吗?

上周,又劝退十几个了。。。

ChatGPT 4o 国内直接用 !!!

最后给大家推荐一个ChatGPT 4.0国内网站,是我们团队一直在使用的,我们对接是OpenAI官网的账号,给大家打造了一个一模一样ChatGPT,很多粉丝朋友现在也都通过我拿这种号,价格不贵,关键还有售后。

一句话说明:用官方一半价格的钱,一句话说明:用跟官方 ChatGPT4.0 一模一样功能,无需魔法,无视封号,不必担心次数不够。

最大优势:可实现会话隔离!突破限制:官方限制每个账号三小时可使用40次4.0本网站可实现次数上限之后,手动切换下一个未使用的账号【相当于一个4.0帐号,同享受一百个账号轮换使用权限】


为了跟上AI时代我干了一件事儿,我创建了一个知识星球社群:ChartGPT与副业。想带着大家一起探索ChatGPT和新的AI时代

有很多小伙伴搞不定ChatGPT账号,于是我们决定,凡是这三天之内加入ChatPGT的小伙伴,我们直接送一个正常可用的永久ChatGPT独立账户。

不光是增长速度最快,我们的星球品质也绝对经得起考验,短短一个月时间,我们的课程团队发布了8个专栏、18个副业项目

简单说下这个星球能给大家提供什么:


1、不断分享如何使用ChatGPT来完成各种任务,让你更高效地使用ChatGPT,以及副业思考、变现思路、创业案例、落地案例分享。

2、分享ChatGPT的使用方法、最新资讯、商业价值。

3、探讨未来关于ChatGPT的机遇,共同成长。

4、帮助大家解决ChatGPT遇到的问题。

5、提供一整年的售后服务,一起搞副业

星球福利:

1、加入星球4天后,就送ChatGPT独立账号。

2、邀请你加入ChatGPT会员交流群。

3、赠送一份完整的ChatGPT手册和66个ChatGPT副业赚钱手册。

其它福利还在筹划中... 不过,我给你大家保证,加入星球后,收获的价值会远远大于今天加入的门票费用 !

本星球第一期原价399,目前属于试运营,早鸟价149,每超过50人涨价10元,星球马上要来一波大的涨价,如果你还在犹豫,可能最后就要以更高价格加入了。。

早就是优势。建议大家尽早以便宜的价格加入!


PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。


最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。

别找了,想获取史上最简单的Java大厂面试题学习资料

扫下方二维码回复面试就好了

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

看看人家那权限管理系统,那叫一个优雅(附源码)!

牛逼啊!接私活必备的 400 多个开源项目!赶快收藏吧(附源码合集)!

用雪花 id 和 uuid 做 MySQL 主键,被领导怼了

项目从 MySQL 切换 PostgreSQL,踩了太多的坑!!!

,你在看吗?

编程技术圈
(本号原名:程序员小乐) 这里有Java、架构、Python、技术、算法、职场、感悟、面经、资源等,一线大厂干货,10万 + 程序员都在看,做一个有趣的帮助程序员成长的架构师公众号,每天早上07点24,第一时间与你相约。
 最新文章