SpringBoot2 整合ElasticJob框架,定製化管理流程
阿新 • • 發佈:2020-03-12
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)
# 一、ElasticJob簡介
## 1、定時任務
在前面的文章中,說過QuartJob這個定時任務,被廣泛應用的定時任務標準。但Quartz核心點在於執行定時任務並不是在於關注的業務模式和場景,缺少高度自定義的功能。Quartz能夠基於資料庫實現任務的高可用,但是不具備分散式並行排程的功能。
[-> QuartJob定時任務](https://mp.weixin.qq.com/s?__biz=MzU4Njg0MzYwNw==&mid=2247483774&idx=1&sn=e5c2eed4a989bedd5c3b108c7dc18c37&chksm=fdf455c6ca83dcd0bccf71aa07639b8ef514e3b6e6d85c6aeb4bceae30d58f021c9d7ba8590b&token=1295430800&lang=zh_CN#rd)
## 2、ElasticJob說明
- 基礎簡介
Elastic-Job 是一個開源的分散式排程中介軟體,由兩個相互獨立的子專案 Elastic-Job-Lite 和 Elastic-Job-Cloud 組成。Elastic-Job-Lite 為輕量級無中心化解決方案,使用 jar 包提供分散式任務的排程和治理。 Elastic-Job-Cloud 是一個 Mesos Framework,依託於Mesos額外提供資源治理、應用分發以及程序隔離等服務。
- 功能特點
```
分散式排程協調
彈性擴容縮容
失效轉移
錯過執行作業重觸發
作業分片一致性,保證同一分片在分散式環境中僅一個執行例項
```
`補刀`:人家官網這樣描述的,這裡贅述一下,充實一下文章。
- 基礎框架結構
該圖片來自ElasticJob官網。
![](https://img2020.cnblogs.com/blog/1691717/202003/1691717-20200312073626272-1261035693.png)
由圖可知如下內容:
需要Zookeeper元件支援,作為分散式的排程任務,有良好的監聽機制,和控制檯,下面的案例也就衝這個圖解來。
## 3、分片管理
這個概念在ElasticJob中是最具有特點的,實用性極好。
- 分片概念
任務的分散式執行,需要將一個任務拆分為多個獨立的任務項,然後由分散式的伺服器分別執行某一個或幾個分片項。
場景描述:假設有服務3臺,分3片管理,要處理資料表100條,那就可以100%3,按照餘數0,1,2分散到三臺服務上執行,看到這裡分庫分表的基本邏輯湧上心頭,這就是為何很多大牛講說,程式設計思維很重要。
- 個性化引數
個性化引數即shardingItemParameter,可以和分片項匹配對應關係,用於將分片項的數字轉換為更加可讀的業務程式碼。
場景描述:這裡猛一讀好像很飄逸,其實就是這個意思,如果分3片,取名[0,1,2]不好看,或者不好標識,可以分別給個別名標識一下,[0=A,1=B,2=C]。
# 二、定時任務載入
## 1、核心依賴包
這裡使用2.0+的版本。
```xml
```
## 2、核心配置檔案
這裡主要配置一下Zookeeper中介軟體,分片和分片引數。
```
zookeeper:
server: 127.0.0.1:2181
namespace: es-job
job-config:
cron: 0/10 * * * * ?
shardCount: 1
shardItem: 0=A,1=B,2=C,3=D
```
## 3、自定義註解
看了官方的案例,沒看到好用的註解,這裡只能自己編寫一個,基於案例的載入過程和核心API作為參考。
核心配置類:
```
com.dangdang.ddframe.job.lite.config.LiteJobConfiguration
```
根據自己想如何使用註解的思路,比如我只想註解定時任務名稱和Cron表示式這兩個功能,其他引數直接統一配置(這裡可能是受QuartJob影響太深,可能根本就是想省事...)
```java
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TaskJobSign {
@AliasFor("cron")
String value() default "";
@AliasFor("value")
String cron() default "";
String jobName() default "";
}
```
## 4、作業案例
這裡列印一些基本引數,對照配置和註解,一目瞭然。
```java
@Component
@TaskJobSign(cron = "0/5 * * * * ?",jobName = "Hello-Job")
public class HelloJob implements SimpleJob {
private static final Logger LOG = LoggerFactory.getLogger(HelloJob.class.getName()) ;
@Override
public void execute(ShardingContext shardingContext) {
LOG.info("當前執行緒: "+Thread.currentThread().getId());
LOG.info("任務分片:"+shardingContext.getShardingTotalCount());
LOG.info("當前分片:"+shardingContext.getShardingItem());
LOG.info("分片引數:"+shardingContext.getShardingParameter());
LOG.info("任務引數:"+shardingContext.getJobParameter());
}
}
```
## 5、載入定時任務
既然自定義註解,那載入過程自然也要自定義一下,讀取自定義的註解,配置化,加入容器,然後初始化,等著任務執行就好。
```java
@Configuration
public class ElasticJobConfig {
@Resource
private ApplicationContext applicationContext ;
@Resource
private ZookeeperRegistryCenter zookeeperRegistryCenter;
@Value("${job-config.cron}") private String cron ;
@Value("${job-config.shardCount}") private int shardCount ;
@Value("${job-config.shardItem}") private String shardItem ;
/**
* 配置任務監聽器
*/
@Bean
public ElasticJobListener elasticJobListener() {
return new TaskJobListener();
}
/**
* 初始化配置任務
*/
@PostConstruct
public void initTaskJob() {