SpringBoot使用Elastic-Job
本文介紹SpringBoot整合Elastic-Job分布式調度任務(簡單任務)。
1.有關Elastic-Job
Elastic-Job是當當網開源的分布式任務調度解決方案,是業內使用較多的分布式調度解決方案。
這裏主要介紹Elastic-Job-Lite,Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供最輕量級的分布式任務的協調服務,外部依賴僅Zookeeper。
架構圖如下:
Elastic-Job官網地址:http://elasticjob.io/index_zh.html
Elastic-Job-Lite官方文檔地址:http://elasticjob.io/docs/elastic-job-lite/00-overview/intro/
2.使用Elastic-Job
2.1 加入依賴
新建項目,在項目中加入Elastic-Job依賴,完整pom如代碼清單所示。
<?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.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.dalaoyang</groupId> <artifactId>springboot2_elasticjob</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot2_elasticjob</name> <description>springboot2_elasticjob</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <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> <dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-core</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-spring</artifactId> <version>2.1.5</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 配置文件
配置文件中需要配置一下zookeeper地址和namespace名稱,註意:這個不是必須要配置的,在文件中直接寫死也是可以的,配置文件如下所示。
spring.application.name=springboot2_elasticjob
regCenter.serverList=localhost:2181
regCenter.namespace=springboot2_elasticjob
2.3 配置zookeeper
接下來需要配置一下zookeeper,創建一個JobRegistryCenterConfig,內容如下:
@Configuration @ConditionalOnExpression("'${regCenter.serverList}'.length() > 0") public class JobRegistryCenterConfig { @Bean(initMethod = "init") public ZookeeperRegistryCenter regCenter(@Value("${regCenter.serverList}") final String serverList, @Value("${regCenter.namespace}") final String namespace) { return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace)); } }
2.4 定義Elastic-Job任務
配置一個簡單的任務,這裏以在日誌中打印一些參數為例,如下所示。
public class MySimpleJob implements SimpleJob {
Logger logger = LoggerFactory.getLogger(MySimpleJob.class);
@Override
public void execute(ShardingContext shardingContext) {
logger.info(String.format("Thread ID: %s, 作業分片總數: %s, " +
"當前分片項: %s.當前參數: %s," +
"作業名稱: %s.作業自定義參數: %s"
,
Thread.currentThread().getId(),
shardingContext.getShardingTotalCount(),
shardingContext.getShardingItem(),
shardingContext.getShardingParameter(),
shardingContext.getJobName(),
shardingContext.getJobParameter()
));
}
}
2.5 配置任務
配置任務的時候,這裏定義了四個參數,分別是:
- cron:cron表達式,用於控制作業觸發時間。
- shardingTotalCount:作業分片總數
- shardingItemParameters:分片序列號和參數用等號分隔,多個鍵值對用逗號分隔
分片序列號從0開始,不可大於或等於作業分片總數
如:
0=a,1=b,2=c - jobParameters:作業自定義參數
作業自定義參數,可通過傳遞該參數為作業調度的業務方法傳參,用於實現帶參數的作業
例:每次獲取的數據量、作業實例從數據庫讀取的主鍵等。
至於其他參數請參考文檔,http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
本文配置如下:
@Configuration
public class MyJobConfig {
private final String cron = "0/5 * * * * ?";
private final int shardingTotalCount = 3;
private final String shardingItemParameters = "0=A,1=B,2=C";
private final String jobParameters = "parameter";
@Autowired
private ZookeeperRegistryCenter regCenter;
@Bean
public SimpleJob stockJob() {
return new MySimpleJob();
}
@Bean(initMethod = "init")
public JobScheduler simpleJobScheduler(final SimpleJob simpleJob) {
return new SpringJobScheduler(simpleJob, regCenter, getLiteJobConfiguration(simpleJob.getClass(),
cron, shardingTotalCount, shardingItemParameters, jobParameters));
}
private LiteJobConfiguration getLiteJobConfiguration(final Class<? extends SimpleJob> jobClass,
final String cron,
final int shardingTotalCount,
final String shardingItemParameters,
final String jobParameters) {
// 定義作業核心配置
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(jobClass.getName(), cron, shardingTotalCount).
shardingItemParameters(shardingItemParameters).jobParameter(jobParameters).build();
// 定義SIMPLE類型配置
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, jobClass.getCanonicalName());
// 定義Lite作業根配置
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
return simpleJobRootConfig;
}
}
3.測試
啟動項目,就可以看到控制臺的輸出了,如下所示:
4.源碼
源碼地址:https://gitee.com/dalaoyang/springboot_learn/tree/master/springboot2_elasticjob
SpringBoot使用Elastic-Job