Elastic-Job支持 JAVA API 和 Spring 配置兩種方式配置任務,這裏咱們使用 JAVA API 的形式來建立一個簡單的任務入門,如今都是 Spring Boot 時代了,因此不建議使用 Spring 配置文件的形式。spring
Elastic-Job 須要依賴 Zookeeper 中間件,用於註冊和協調做業分佈式行爲的組件,目前僅支持 Zookeeper。咱們已經建立了 Zookeeper 集羣!數據庫
一、Java 請使用 JDK 1.7 及其以上版本。apache
二、Zookeeper 請使用 Zookeeper 3.4.6 及其以上版本。服務器
三、Maven 請使用 Maven 3.0.4 及其以上版本。微信
<dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-core</artifactId> <version>2.1.5</version> </dependency>
這裏有一個坑,這個依賴裏面會包含有兩個不一樣版本的 curator-client,致使調用裏面方法的時候會找不到方法,因此須要單獨引入 curator-client 的依賴包。架構
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>2.11.1</version> </dependency>
Elastic-Job 提供 Simple、Dataflow 和 Script 3種做業類型。框架
方法參數 shardingContext 包含做業配置、片和運行時信息。可經過 getShardingTotalCount(), getShardingItem() 等方法分別獲取分片總數,運行在本做業服務器的分片序列號等。maven
這裏咱們建立一個簡單(Simple)做業。分佈式
public class MyElasticJob implements SimpleJob { @Override public void execute(ShardingContext context) { switch (context.getShardingItem()) { case 0: { System.out.println("MyElasticJob - 0"); break; } case 1: { System.out.println("MyElasticJob - 1"); break; } case 2: { System.out.println("MyElasticJob - 2"); break; } default: { System.out.println("MyElasticJob - default"); } } } }
上面的0-2涉及分佈式做業框架中分片的概念ide
任務的分佈式執行,須要將一個任務拆分爲多個獨立的任務項,而後由分佈式的服務器分別執行某一個或幾個分片項。
例如:有一個遍歷數據庫某張表的做業,現有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結尾的數據。
做業分片策略:http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/
Elastic-Job 配置分爲3個層級,分別是 Core, Type 和 Root,每一個層級使用類似於裝飾者模式的方式裝配。
Core 對應 JobCoreConfiguration,用於提供做業核心配置信息,如:做業名稱、分片總數、CRON表達式等。
Type 對應 JobTypeConfiguration,有3個子類分別對應 SIMPLE, DATAFLOW 和 SCRIPT 類型做業,提供3種做業須要的不一樣配置,如:DATAFLOW 類型是否流式處理或 SCRIPT 類型的命令行等。
Root 對應 JobRootConfiguration,有2個子類分別對應 Lite 和 Cloud 部署類型,提供不一樣部署類型所需的配置,如:Lite類型的是否須要覆蓋本地配置或 Cloud 佔用 CPU 或 Memory 數量等。
在 Spring Boot 啓動類裏面加做業配置代碼。
private static CoordinatorRegistryCenter createRegistryCenter() { CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("192.168.10.31:2181,192.168.10.32:2181,192.168.10.33:2181", "elastic-job-demo")); regCenter.init(); return regCenter; } private static LiteJobConfiguration createJobConfiguration() { // 定義做業核心配置 JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 10).build(); // 定義SIMPLE類型配置 SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MyElasticJob.class.getCanonicalName()); // 定義Lite做業根配置 LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build(); } @Bean public CommandLineRunner commandLineRunner() { return (String... args) -> { new JobScheduler(createRegistryCenter(), createJobConfiguration()).init(); }; }
SimpleJobConfiguration 實現了JobTypeConfiguration接口。
LiteJobConfiguration 實現了JobRootConfiguration接口。
使用CommandLineRunner,能夠等 Spring Boot 啓動後再啓動 Elastic-Job 做業。
其餘的最基礎的 Spring Boot 的配置就不說了,不懂的能夠去公衆號菜單 Spring Boot 專題中學習。
更多做業的配置請參考官方文檔:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
在工具裏面使用 maven 命令 spring-boot:run 啓動便可。
程序輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default
因爲是單個實例,全部 10 個分片都在一個實例輸出來了,如今咱們把它打成 jar 包,而後再用另一個端口啓動看下是否分片成功。
兩邊分別輸出:
MyElasticJob - 0 MyElasticJob - 1 MyElasticJob - 2 MyElasticJob - default MyElasticJob - default
和
MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default MyElasticJob - default
上面的輸出信息說明分片成功了,而後停掉一個項目後發現又自動觸發分片,全部的都在同一個輸出來了。
能夠看出分片功能真的很是實用,做業開發起來真的很方便,整個架構也很清晰,推薦你們使用。
後面還更多的 Elastic-Job 實戰乾貨請繼續關注,以爲有用就動手分享鼓勵一下咱們吧!
掃描關注咱們的微信公衆號,乾貨天天更新。