簡介
Elastic-Job是一個分布式調度解決方案,由兩個相互獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。
Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務的協調服務。
功能列表:
- 分布式調度協調
- 彈性擴容縮容
- 失效轉移
- 錯過執行作業重觸發
- 作業分片一致性,保證同一分片在分布式環境中僅一個執行實例
- 自診斷並修復分布式不穩定造成的問題
- 支持並行調度
- 支持作業生命周期操作
- 豐富的作業類型
- Spring整合以及命名空間提供
- 運維平台
入門開發
pom文件
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
<!-- 使用springframework自定義命名空間時引入 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:job="http://www.dangdang.com/schema/ddframe/job"
xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.dangdang.com/schema/ddframe/job
http://www.dangdang.com/schema/ddframe/job/job.xsd
http://www.dangdang.com/schema/ddframe/reg
http://www.dangdang.com/schema/ddframe/reg/reg.xsd">
<!--Zookeeper注冊中心 -->
<reg:zookeeper id="regCenter" server-lists="127.0.0.1:2181"
namespace="elastic-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
<!-- 配置作業-->
<job:simple id="myElasticJob" class="com.job.MyElasticJob" registry-center-ref="regCenter"
cron="0/30 * * * * ?" sharding-total-count="1" overwrite="true"
event-trace-rdb-data-source="dataSource"/>
</beans>
當在<job:simple>中配置了數據源(如上)時,會自動創建兩張數據庫表分別是JOB_EXECUTION_LOG和JOB_STATUS_TRACE_LOG
JOB_EXECUTION_LOG記錄每次作業的執行歷史。分為兩個步驟:
-
作業開始執行時向數據庫插入數據,除failure_cause和complete_time外的其他字段均不為空。
-
作業完成執行時向數據庫更新數據,更新is_success, complete_time和failure_cause(如果作業執行失敗)。
JOB_STATUS_TRACE_LOG記錄作業狀態變更痕跡表。可通過每次作業運行的task_id查詢作業狀態變化的生命周期和運行軌跡。
實現SimleJob接口
public class MyElasticJob implements SimpleJob {
public void execute(ShardingContext shardingContext) {
//1.當分片數為1時,在同一個zookepper和jobname情況下,多台機器部署了Elastic job時,
// 只有拿到shardingContext.getShardingItem()為0的機器得以執行,其他的機器不執行
//總片數
int shardingTotalCount = shardingContext.getShardingTotalCount();
//當前分片項
int shardingItem = shardingContext.getShardingItem();
switch (shardingItem){
case 0:
run();
break;
case 1:
break;
}
}
private void run(){
//dosometing
}
}
