附: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
启动两个,分别查看控制台: