当前位置: 代码迷 >> 综合 >> Elastic-Job (一)实现Simple作业
  详细解决方案

Elastic-Job (一)实现Simple作业

热度:53   发布时间:2023-11-17 12:47:13.0

附:http://elasticjob.io/

一、概述:

    Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

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

二、分片概念:

    任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

例如:

     有一个遍历数据库某张表的作业,现有2台服务器。为了快速的执行作业,那么每台服务器应执行作业的50%。

     为满足此需求,可将作业分成2片,每台服务器执行1片。作业遍历数据的逻辑应为:服务器A遍历ID以奇数结尾的数据;服务器B遍历ID以偶数结尾的数据。

    如果分成10片,则作业遍历数据的逻辑应为:每片分到的分片项应为ID%10,而服务器A被分配到分片项0,1,2,3,4;服务器B被分配到分片项5,6,7,8,9,直接的结果就是服务器A遍历ID以0-4结尾的数据;服务器B遍历ID以5-9结尾的数据。

三、作业开发

  Elastic-Job提供Simple、Dataflow和Script 3种作业类型。 方法参数shardingContext包含作业配置、片和运行时信息。可通过getShardingTotalCount(), getShardingItem()等方法分别获取分片总数,运行在本作业服务器的分片序列号等。

Simple类型作业

      意为简单实现,未经任何封装的类型。需实现SimpleJob接口。该接口仅提供单一方法用于覆盖,此方法将定时执行。与Quartz原生接口相似,但提供了弹性扩缩容和分片等功能。

项目结构: 

ZookeeperConfiguration属性详细说明:

serverLists String 连接Zookeeper服务器的列表,包括IP地址和端口号,多个地址用逗号分隔如: host1:2181,host2:2181
namespace String Zookeeper的命名空间

JobCoreConfiguration属性详细说明:

属性名 类型 构造器注入 描述
jobName String 作业名称
cron String cron表达式,用于控制作业触发时间
shardingTotalCount int 作业分片总数

elastic-job配置:

package com.lucifer.config;import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.JobTypeConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import com.lucifer.job.MySimpleJob;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author lucifer* @date 2020/5/4 19:50* @description elastic-job配置*/
@Configuration
public class LiteJobConfig {private static final String SERVER_LISTS = "192.168.24.128:2181";private static final String NAMES_SPACE = "simple-job";@Beanpublic static void JobScheduler() {new JobScheduler(zkCenter(), jobConfiguration()).init();}public static CoordinatorRegistryCenter zkCenter() {ZookeeperConfiguration zookeeperConfiguration =new ZookeeperConfiguration(SERVER_LISTS, NAMES_SPACE);CoordinatorRegistryCenter coordinatorRegistryCenter =new ZookeeperRegistryCenter(zookeeperConfiguration);//注册中心初始化coordinatorRegistryCenter.init();return coordinatorRegistryCenter;}/*** job配置** @return*/public static LiteJobConfiguration jobConfiguration() {//job核心配置JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder("mySimpleJob", "0/3 * * * * ?", 2).build();//job类型配置JobTypeConfiguration jobTypeConfiguration =new SimpleJobConfiguration(jobCoreConfiguration, MySimpleJob.class.getCanonicalName());//job根的配置LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(jobTypeConfiguration).build();return liteJobConfiguration;}
}

ps:

   可以将JobScheduler()方法放在ElasticJobInit 类中,效果一样,两者选择一种都可以;

   cron表达式生成网址:https://cron.qqe2.com/

package com.lucifer;import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.lucifer.config.LiteJobConfig;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;/*** @author lucifer* @date 2020/5/4 20:20* @description Elastic-Job初始化*/
@Component
public class ElasticJobInit implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {new JobScheduler(LiteJobConfig.zkCenter(), LiteJobConfig.jobConfiguration()).init();}
}

自定义MySimpleJob类,实现SimpleJob接口:

package com.lucifer.job;import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import lombok.extern.slf4j.Slf4j;/*** @author lucifer* @date 2020/5/4 19:12* @description Simple-Job*/
@Slf4j
public class MySimpleJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {log.info("分片项:{},总分片项:{}", shardingContext.getShardingItem(),shardingContext.getShardingTotalCount());}
}

父工程pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.6.RELEASE</version></parent><groupId>org.lucifer</groupId><artifactId>job-study</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><description>学习定时任务框架:Elastic-job + Quartz</description><modules><module>elastic-job</module></modules><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency></dependencies></project>

elastic-job模块pom.xml: 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>job-study</artifactId><groupId>org.lucifer</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>elastic-job</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!--elastic-job--><dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version></dependency></dependencies></project>

启动后,控制台: 

2020-05-04 20:36:34.747  INFO 11772 --- [           main] com.lucifer.ElasticJobApplication        : Started ElasticJobApplication in 1.805 seconds (JVM running for 2.595)
2020-05-04 20:36:36.081  INFO 11772 --- [b-mySimpleJob-2] com.lucifer.job.MySimpleJob              : 分片项:1,总分片项:2
2020-05-04 20:36:36.081  INFO 11772 --- [b-mySimpleJob-1] com.lucifer.job.MySimpleJob              : 分片项:0,总分片项:2
2020-05-04 20:36:39.057  INFO 11772 --- [b-mySimpleJob-3] com.lucifer.job.MySimpleJob              : 分片项:0,总分片项:2
2020-05-04 20:36:39.058  INFO 11772 --- [b-mySimpleJob-4] com.lucifer.job.MySimpleJob              : 分片项:1,总分片项:2
2020-05-04 20:36:42.019  INFO 11772 --- [b-mySimpleJob-5] com.lucifer.job.MySimpleJob              : 分片项:0,总分片项:2
2020-05-04 20:36:42.019  INFO 11772 --- [b-mySimpleJob-6] com.lucifer.job.MySimpleJob              : 分片项:1,总分片项:2

启动两个,分别查看控制台:

  相关解决方案