1. 程式人生 > >Elastic Job入門

Elastic Job入門

Elastic job是噹噹網架構師張亮,曹昊和江樹建基於Zookepper、Quartz開發並開源的一個Java分散式定時任務,解決了Quartz不支援分散式的弊端。Elastic job主要的功能有支援彈性擴容,通過Zookepper集中管理和監控job,支援失效轉移等,這些都是Quartz等其他定時任務無法比擬的。

    目前Elastic job的最新版本已經由原來的elastic-job-core分離除了兩個專案,分別為Elastic-Job-Lite和Elastic-Job-Cloud。Elastic-Job是一個分散式排程解決方案,由兩個相互獨立的子專案Elastic-Job-Lite和Elastic-Job-Cloud組成,Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分散式任務的協調服務。 Elastic-Job-Cloud使用Mesos + Docker(TBD)的解決方案,額外提供資源治理、應用分發以及程序隔離等服務,Elastic-Job-Lite和Elastic-Job-Cloud提供同一套API開發作業,開發者僅需一次開發,即可根據需要以Lite或Cloud的方式部署

    1.實戰

         maven依賴:

  1. <!-- 引入elastic-job-lite核心模組 -->  
  2. <!-- https://mvnrepository.com/artifact/com.dangdang/elastic-job-lite-core -->
  3. <dependency>  
  4.     <groupId>com.dangdang</groupId>  
  5.     <artifactId>elastic-job-lite-core</artifactId>  
  6.     <version>2.0
    .0</version>  
  7. </dependency>  
  8. <!-- 使用springframework自定義名稱空間時引入 -->  
  9. <dependency>  
  10.     <groupId>com.dangdang</groupId>  
  11.     <artifactId>elastic-job-lite-spring</artifactId>  
  12.     <version>2.0.0</version>  
  13. </dependency>  

      MyElasticJob.java

  1. package com.lance.job;  
  2. import com.dangdang.ddframe.job.api.ShardingContext;  
  3. import com.dangdang.ddframe.job.api.simple.SimpleJob;  
  4. /** 
  5.  * Created by zhangzh on 2017/2/15. 
  6.  */
  7. publicclass MyElasticJob implements SimpleJob {  
  8.     publicvoid execute(ShardingContext shardingContext) {  
  9.         //1.當分片數為1時,在同一個zookepper和jobname情況下,多臺機器部署了Elastic job時,只有拿到shardingContext.getShardingItem()為0的機器得以執行,其他的機器不執行
  10.         //2.當分片數大於1時,假如有3臺伺服器,分成10片,則分片項分配結果為伺服器A=0,1,2;伺服器B=3,4,5;伺服器C=6,7,8,9。此時每臺伺服器可根據拿到的shardingItem值進行相應的處理,
  11.          // 舉例場景:
  12.          // 假如job處理資料庫中的資料業務,方法為:A伺服器處理資料庫中Id以0,1,2結尾的資料,B處理資料庫中Id以3,4,5結尾的資料,C處理器處理6,7,8,9結尾的資料,合計處理0-9為全部資料
  13.          // 如果伺服器C崩潰,Elastic Job自動進行進行失效轉移,將C伺服器的分片轉移到A和B伺服器上,則分片項分配結果為伺服器A=0,1,2,3,4;伺服器B=5,6,7,8,9
  14.               // 此時,A伺服器處理資料庫中Id以0,1,2,3,4結尾的資料,B處理資料庫中Id以5,6,7,8,9結尾的資料,合計處理0-9為全部資料.
  15.         processByEndId(shardingContext.getShardingItem());  
  16.     }  
  17.     privatevoid processByEndId(int shardingContext) {  
  18.         // TODO: 2017/2/15  處理資料Id結尾為 shardingContext的資料
  19.     }  
  20. }  

       上下文配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
  5.        xmlns:job="http://www.dangdang.com/schema/ddframe/job"
  6.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  7.                         http://www.springframework.org/schema/beans/spring-beans.xsd
  8.                         http://www.dangdang.com/schema/ddframe/reg
  9.                         http://www.dangdang.com/schema/ddframe/reg/reg.xsd
  10.                         http://www.dangdang.com/schema/ddframe/job
  11.                         http://www.dangdang.com/schema/ddframe/job/job.xsd
  12.                         ">  
  13.     <!--Zookeeper註冊中心 -->  
  14.     <reg:zookeeper id="regCenter" server-lists="zookeeperServerIp:2181" namespace="dd-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />  
  15.     <!-- 配置作業-->  
  16.     <job:simple id="myElasticJob"class="com.lance.job.MyElasticJob" registry-center-ref="regCenter" cron="0 */5 * * * ?" sharding-total-count="1"/>  
  17. </beans>  

看,簡單吧!