分布式定时任务(一) Elastic Job 开发部署实战(结合Spring Boot开发分布式任务调度)

分布式定时任务(一) 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. 运行测试

  1. 在运行 ElasticJobApplication 启动类之前,先回到ZK客户端 Terminal(终端),输入命令 ls /,观察根节点下的子节点。当前只有一名为zookeeper的子节点

请添加图片描述

  1. 运行 ElasticJobApplication 启动类。观察控制台,等待一会,可发现定时任务已经开始执行了。

在这里插入图片描述

  1. 再回到 ZK客户端,输入命令 ls /,观察根节点下的子节点。当前多了一个通过 ZooKeeperConfig 配置的命名空间为名称的子节点。

请添加图片描述

  1. 输入命令 ls -R / 查看 elastic_job_config_file 节点下的详情,可以观察到如下信息。

在这里插入图片描述

到此处已表示,ElasticJob已经部署成功,定时任务信息已上传到ZK。

5.结语

本文仅仅描述了如何整合SpringBoot搭建ElasticJob,教程十分简单,有很多较难的重点没有讲解,旨在让读者学会快速入门。有关更高级的教程和原理性讲解,博主后面再利用空闲时间为大家。

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值