您的位置 首页 java

Spring Boot集成定时任务功能详细解析

Spring Boot集成定时任务功能详细解析

Spring Boot集成定时任务功能详细解析

使用Spring Boot可以实现集成定时任务功能,主要分为以下几种:

一、使用注解

@EnableScheduling:启动类上开启基于注解的定时任务

@Scheduled:标识的方法会进行定时处理

Spring Boot集成定时任务功能详细解析

二、使用的启动类

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.scheduling.annotation.EnableScheduling;

// 开启注解版的定时任务

@EnableScheduling

@SpringBootApplication

public class SpringBootGongfuApplication {

public static void main(String[] args) {

SpringApplication.run(SpringBootGongfuApplication.class, args);

}

}

Spring Boot集成定时任务功能详细解析

三、业务方法启动

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Service;

/**

* 创建定时任务

*/

@Service

public class ScheduledService {

private static int count = 1;

@Scheduled(cron = “0/5 * * * * ?”)

public void dataCount() {

System.out.println(“数据统计第” + count++ + “次”);

}

}

Spring Boot集成定时任务功能详细解析

四、扩展集成框架

4.1ElasticJob

接下来介绍Spring Boot的扩展定时任务集成框架ElasticJob:ElasticJob 是一个扩展分布式作业调度解决方案,ElasticJob 通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态。

使用 ElasticJob 能够让开发工程师不再担心任务的线性吞吐量提升等非功能需求,使他们能够更加专注于面 向业 务 编码设计;同时,它也能够解放运维工程师,使他们不必再担心任务的可用性和相关管理需求,只通过轻松的增加服务节点即可达到自动化运维的目的。

ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。

其中 ElasticJob-Lite 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务:

Spring Boot集成定时任务功能详细解析

ElasticJob-Cloud 则采用自研 Mesos Framework 的解决方案,额外提供资源治理、应用分发以及进程隔离等功能:

Spring Boot集成定时任务功能详细解析

ElasticJob 的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。

Spring Boot集成定时任务功能详细解析

4.2ElasticJob功能列表

(1)弹性调度

(2)支持任务在分布式场景下的分片和高可用

(3)能够水平扩展任务的吞吐量和执行效率

(4)任务处理能力随资源配备弹性伸缩

(5)资源分配

(6)在适合的时间将适合的资源分配给任务并使其生效

(7)相同任务聚合至相同的执行器统一处理

(8)动态调配追加资源至新分配的任务

(9)作业治理

(10)失效转移

(11)错过作业重新执行

(12)自诊断修复

(13)作业依赖(TODO)

(14)基于有向无环图(DAG)的作业间依赖

(15)基于有向无环图(DAG)的作业分片间依赖

(16)作业开放生态

(17)可扩展的作业类型统一接口

(18)丰富的作业类型库,如数据流、脚本、HTTP、文件、大数据等

(19)易于对接业务作业,能够与 Spring 依赖注入无缝整合

(20)可视化运维平台(

(21)作业管控端

(22)作业执行历史数据追踪

(23)注册中心管理

Spring Boot集成定时任务功能详细解析

4.3ElasticJob实践

在Spring Boot项目中引入ElasticJob坐标:

<dependency>

<groupId>org.apache.shardingsphere.elasticjob</groupId>

<artifactId>elasticjob-lite-spring-boot-starter</artifactId>

<version>3.0.1</version>

</dependency>

接下来我们创建一个作业,作业有几种不同的创建方式,我们先来看一种基于实现 SimpleJob 接口创建的作业:

/**

* Java功夫

*/

@Component

public class GongfuJob implements SimpleJob {

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

@Override

public void execute(ShardingContext shardingContext) {

logger.info(“作业名称:{};作业参数:{};分片总数:{};当前分片:{};分片参数:{};任务编号:{}”,shardingContext.getJobName(),shardingContext.getJobParameter(),shardingContext.getShardingTotalCount(),shardingContext.getShardingItem(),shardingContext.getShardingParameter(),shardingContext.getTaskId());

}

}

当定时任务执行的时候,execute 方法会被触发,其中 参 数 ShardingContext 中保存着定 时任 务相 关的参数,这些参数都是我们在 application.properties 中 配置的,我们继续来看:

elasticjob.reg-center.server-lists=zoo1:2181,zoo2:2182,zoo3:2183

elasticjob.reg-center.namespace=javagongfu

elasticjob.jobs.my-gongfu-job.elastic-job-class=org.javaboy.elasticjob.job. GongfuJob

elasticjob.jobs.my-gongfu-job.cron=0/3 * * * * ?

elasticjob.jobs.my-gongfu-job.sharding-total-count=1

elasticjob.jobs.my-gongfu-job.overwrite=true

elasticjob.jobs.my-gongfu-job.job-parameter=hello javagongfu!

elasticjob.jobs.my-gongfu-job.sharding-item-parameters=0=A,1=B,2=C

这里的配置分为两大类:

(1)注册中心配置

(2)定时任务配置

使用 ElasticJob 需要注册中心 zookeeper,这个也好理解,因为 ElasticJob 支持任务在分布式场景下的分片和高可用,所以必然需要一个调度中心,这个 zk 就是调度中心。我这里开启了一 个 zk 集群,里边有三个实例,三个 zk 地址之间用 , 隔开。同时我们还要配置一个 namespace,这个 namespace 的作用是防止不同应用的定时任务冲突了,我们给每个应用取一个不同于其他应用的 namespace,这样就不用担心冲突了。

接下来是配置作业:

配置作业的前缀统一是 elasticjob.jobs,紧接着就是作业的名称,这个作业名称可以随意配置,但是最好能一眼看出来是哪个作业,GongfuJob#execute 方法中的

shardingContext.getJobName() 获取到的就是这个值。

我们这里一共配置了六个属性,我来一一解释下:

elastic-job-class:作业的全路径。

cron:cron 表达式。

sharding-total-count:分片的总数,即有几个实例执行当前定时任务,GongfuJob#execute 方法中的 shardingContext.getShardingTotalCount() 获取到的就是这个值。

overwrite:是否每次启动的时候覆盖之前的配置,如果设置为 false,则如果修改了 cron 表达式等,重启之后不会生效。

job-parameter:作业的参数,GongfuJob#execute 方法中的 shardingContext.getJobParameter() 获取到的就是这个值。

sharding-item-parameters:分片的参数,0、1、2 分别表示第几个分片,GongfuJob#execute 方法中的 shardingContext.getShardingParameter() 获取到的就是这个值。

好啦,现在就配置完成了。

Spring Boot集成定时任务功能详细解析

4.4启动 Spring Boot 项目

启动Spring Boot后,控制台每隔三秒钟打印一次日志。

再次启动Spring Boot项目,我们发现第一次启动的实例中已经没有打印日志了,转而在第二次启动的实例中打印日志,这就是因为我们配置的 sharding-total-count 为 1,即同一时间只有一个实例中的定时任务在运行。

Spring Boot集成定时任务功能详细解析

五、总结

上面介绍了Spring Boot项目自带的定时任务和扩展组件 ElasticJob 的用法,笔者之前博客也介绍过Spring Boot定时任务,Spring Boot与Quartz定时任务中心与源码分析: ,Spring Boot集成定时任务:

文章来源:智云一二三科技

文章标题:Spring Boot集成定时任务功能详细解析

文章地址:https://www.zhihuclub.com/179644.shtml

关于作者: 智云科技

热门文章

网站地图