分布式定时任务(一) Elastic Job 开发部署实战(结合Spring Boot开发分布式任务调度)
文章目录
0. 概要
本文目的在于快速入门 Elastic Job 开发部署,有关理论知识不做赘述,读者可以从 ElasticJob官网 了解技术框架。

1. 准备工作
根据官网环境要求:
- Java:请使用 Java 8 及其以上版本。
- Maven:用 Maven 3.5.0 及其以上版本。
- ZooKeeper:请使用 ZooKeeper 3.6.0 及其以上版本。
2. ZooKeeper 安装部署
2.1 ZK 简介
ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题,如:
- 数据发布与订阅(配置中心)
- 负载均衡
- 命名服务(Naming Service)
- 分布式通知/协调
- 集群管理与Master选举
- 分布式锁
- 分布式队列
2.2 下载安装
点击 ZooKeeper下载地址,选择 3.6.0版本及以上。
⚠️ 此处重点选择后缀 -bin.tar.gz 结尾的,不要不要不要选择 .tar.gz 结尾的。
下载解压之后进入目录,点击conf(我这里是3.7.2版本,都是一样的操作步骤)。
将 conf 目录中的 zoo_sample.cfg 重名为 zoo.cfg,或者复制一份命名为 zoo.cfg。
2.3 运行 ZK
进入解压目录下的bin目录,打开控制台。
1.打开终端,进入该目录,并输入./zkServer.sh start ,启动服务端(Windows 直接点击zkServer.cmd 即可)。最终显示 STARTED 就表示启动成功了。
2.服务端启动成功后,再输入./zkCli.sh ,启动客户端(Windows 直接点击zkCli.cmd 即可)。如图,博主另开了一个窗口,输入命令后,先打印了一批启动日志,最终显示 [zk: localhost:2181(CONNECTED) 0]
表示连接上 ZK 服务端。
2.4 ZK使用命令
相关使用命令可参考 Zookeeper-使用篇 ,下面章节会用到如下命令:
读取节点 (ls & get)
3. Elastic Job项目搭建
3.1. 依赖导入
首先新建一个 maven 项目,导入如下依赖:
<!-- elasticJob客户端:https://shardingsphere.apache.org/elasticjob/index_zh.html -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
<!-- 非spring项目则导入如下依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
官网最新版本3.X 的依赖坐标如下
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-bootstrap</artifactId>
<version>${latest.release.version}</version>
</dependency>
-->
<!-- 非Spring项目,以下依赖不需要添加 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
3.2. 配置类
ZooKeeper注册中心配置类。
/**
* @Name: ZooKeeperConfig
* @Description: ZK配置类
* @Author: ahao
* @Date: 2023/12/15 1:43 PM
*/
@Configuration
public class ZooKeeperConfig {
@Value("${zookeeper.url:localhost}")
private String zookeeper_url;
@Value("${zookeeper.port:2181}")
private String zookeeper_post;
@Value("${elastic.job.namespace:elastic_job_demo}")
private String namespace;
// 注意:此处需要添加初始化方法
@Bean(initMethod = "init")
public CoordinatorRegistryCenter setUpRegistryCenter(){
//注册中心配置
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(zookeeper_url+":"+zookeeper_post,namespace);
//减少zk的超时时间
zookeeperConfiguration.setSessionTimeoutMilliseconds(1000);
//创建注册中心
CoordinatorRegistryCenter registryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
//registryCenter.init(),如果非Spring项目,需要手动init
return registryCenter;
}
}
以上配置属性可通过配置文件配置,但非必需。配置文件如下:
# zookeeper配置信息
zookeeper:
url: localhost
post: 2181
# elastic-job 配置
elastic:
job:
namespace: elastic_job_config_file
ElasticJob任务配置类。构建新的定时任务时只需要按照 springJobScheduler()
类似地构建一个 SpringJobScheduler
类型的 bean 即可。
/**
* @Name: ElasticJobConfig
* @Description: ElasticJob配置类
* @Author: ahao
* @Date: 2023/12/15 1:51 PM
*/
@Configuration
public class ElasticJobConfig {
@Autowired
private CoordinatorRegistryCenter registryCenter;
@Autowired
private SpringTask task;
/**
* 定时任务bean
*/
@Bean(initMethod = "init")
public SpringJobScheduler springJobScheduler(){
LiteJobConfiguration jobConfiguration = createJobConfiguration(task.getClass(),
"1/10 * * * * ?",
6,
"0=Monday,1=Tuesday,2=Wednesday,3=Thursday,4=Friday,5=Saturday");
SpringJobScheduler jobScheduler = new SpringJobScheduler(task,registryCenter, jobConfiguration);
return jobScheduler;
}
// LiteJobConfiguration
private LiteJobConfiguration createJobConfiguration(final Class<? extends SimpleJob>
jobClass,
final String cron,
final int shardingTotalCount,
final String shardingItemParameters) {
//创建JobCoreConfiguration
JobCoreConfiguration.Builder builder = JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount);
// 如果分片参数不为空,则添加分片参数
if(StringUtils.isNotEmpty(shardingItemParameters)){
builder.shardingItemParameters(shardingItemParameters);
}
//创建SimpleJobConfiguration
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(configuration,jobClass.getCanonicalName());
//构建任务
LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build();
return liteJobConfiguration;
}
}
3.3. 任务类
SpringTask任务类。
/**
* @Name: SpringTask
* @Description: 任务类
* @Author: ahao
* @Date: 2023/12/15 11:31 AM
*/
@Log4j2
@Component
public class SpringTask implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
log.info("SpringBoot整合ElasticJob。任务信息:{}", shardingContext.getShardingParameter());
}
}
3.4. SpringBoot启动类
/**
* @Name: ElasticJobApplication
* @Description: 启动类
* @Author: ahao
* @Date: 2023/12/15 11:30 AM
*/
@Log4j2
@SpringBootApplication
public class ElasticJobApplication{
public static void main(String[] args) {
SpringApplication.run(ElasticJobApplication.class,args);
}
}
4. 运行测试
- 在运行 ElasticJobApplication 启动类之前,先回到ZK客户端 Terminal(终端),输入命令
ls /
,观察根节点下的子节点。当前只有一名为zookeeper
的子节点
- 运行 ElasticJobApplication 启动类。观察控制台,等待一会,可发现定时任务已经开始执行了。
- 再回到 ZK客户端,输入命令
ls /
,观察根节点下的子节点。当前多了一个通过ZooKeeperConfig
配置的命名空间为名称的子节点。
- 输入命令
ls -R /
查看elastic_job_config_file
节点下的详情,可以观察到如下信息。
到此处已表示,ElasticJob已经部署成功,定时任务信息已上传到ZK。
5.结语
本文仅仅描述了如何整合SpringBoot搭建ElasticJob,教程十分简单,有很多较难的重点没有讲解,旨在让读者学会快速入门。有关更高级的教程和原理性讲解,博主后面再利用空闲时间为大家。