1. 程式人生 > >elastic job (一) elastic-job-lite----SimpleJob

elastic job (一) elastic-job-lite----SimpleJob

首先我們要了解一下什麼是任務排程,排程就是將一個任務套上一個時間,讓該任務可以在時間規律上去迴圈執行。一般的技術quartz、spring task、java.util.Timer,這幾種如果在單一機器上跑其實問題不大,但是如果一旦應用於叢集環境做分散式部署,就會帶來一個致命的問題,那就是重複執行,當然解決方案有,但是必須依賴資料庫,將任務執行狀態持久化下來。所以噹噹就把quartz和zookeeper結合起來達到分散式排程,並且新增其他功能,形成了elastic-job。
功能列表:
分散式排程協調
彈性擴容縮容
失效轉移
錯過執行作業重觸發
作業分片一致性,保證同一分片在分散式環境中僅一個執行例項
自診斷並修復分散式不穩定造成的問題
支援並行排程
支援作業生命週期操作
豐富的作業型別
Spring整合以及名稱空間提供
運維平臺
下面我們來學習一下elastic-job-lite
首先我們可以先將運維平臺搭建起來:
1、

https://github.com/dangdangdotcom/elastic-job
下載原始碼
這裡寫圖片描述
找到elastic-job-lite 下面的elastic-job-lite-console,然後用mvn 打包。
最終得到elastic-job-lite-console-2.1.5.tar.gz。儲存下來上傳到linux下,並且解壓,在bin資料夾下執行./start.sh (-p 可以指定埠號)
啟動成功訪問 地址:埠號
這裡寫圖片描述
能訪問到這個頁面就算搭建成功了。
(elastic-job 是依賴zookeeper來做協調的,所以還需要有zookeeper環境,搭建很簡單,我就不貼出來)
現在開始編寫任務程式碼:
job型別分為 SimpleJob 簡單任務、Dataflow型別作業、Script型別作業
我們先來最簡單的SimpleJob
首先將依賴的包引入進來:

 <dependency>
      <groupId>com.dangdang</groupId>
      <artifactId>elastic-job-lite-core</artifactId>
      <version>2.1.5</version>
 </dependency>

寫一個任務:

package cn.job;

import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;

import
java.util.Date; /** * Created by siliang 2017/7/27. */ public class SimpleJobDemo implements SimpleJob{ @Override public void execute(ShardingContext shardingContext) { System.out.println(new Date()+" job名稱 = "+shardingContext.getJobName() +"分片數量"+shardingContext.getShardingTotalCount() +"當前分割槽"+shardingContext.getShardingItem() +"當前分割槽名稱"+shardingContext.getShardingParameter() +"當前自定義引數"+shardingContext.getJobParameter()+"============start================="); } }

然後再寫一個main函式來啟動

package cn.job;

import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration;
import com.dangdang.ddframe.job.lite.api.JobScheduler;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.reg.base.CoordinatorRegistryCenter;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;

/**
 * Created by siliang on 2017/7/26.
 */
public class TestJob {

    public static void main(String[] args) {
        new JobScheduler(createRegistryCenter(), createJobConfiguration("A")).init();
    }
    private static CoordinatorRegistryCenter createRegistryCenter() {
    //192.168.112.128:2181,192.168.112.128:2182 這個為zk的地址
    //demo-job 這個為1個zk環境的下的1個namespace 可以有多個 1個namespace下有多個job
        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(
                new ZookeeperConfiguration("192.168.112.128:2181,192.168.112.128:2182", "demo-job"));
        regCenter.init();
        return regCenter;
    }
    private static LiteJobConfiguration createJobConfiguration(String jobParameter) {
        // mySimpleTest 為jobname 0/10 * * * * ?為cron表示式  2 分片數量  0=北京,1=上海 分片對應內容  jobParameter 自定義引數
       JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("simpleJobDemo", "0/10 * * * * ?", 2).shardingItemParameters("0=北京,1=上海").jobParameter(jobParameter).build();
        SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, SimpleJobDemo.class.getCanonicalName());
        JobRootConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();

        return  result;
    }

}

執行一下:
這裡寫圖片描述
可以看到每隔10秒 2個分片都執行了,這就是 切片功能,可以並行處理。比如2個DB 一個在上海一個在北京,那麼就可以按照分片的內容來進行分別執行2個地區的資料。

然後回到運維介面,這裡寫圖片描述
在註冊中心點選 ADD 註冊中心名稱:隨便定 註冊中心地址: zk 地址 名稱空間就是之前說到namespace,登入憑證如果沒有可以不填。新增完之後點選連線。
這裡寫圖片描述
連線完之後點選作業維度,可以看到剛剛執行的任務,目前狀態是已下線。
現在再把之前的mian函式執行一下,這裡寫圖片描述
可以看到狀態已經是正常了,並且多了好幾個操作。其他的都很明白,就修改比較重要點。點選
這裡寫圖片描述
可以看到除了上面3個選項其他都可以更改,main函式不關閉,並且在運維平臺直接修改配置,會立即生效,大家可以自己試試玩玩。有一點需要提醒的是 如果在平臺修改過配置,如果沒有在平臺將任務刪除重新執行main函式的話,配置是會被平臺的配置覆蓋的。
這是elastic-job-lite 的SimpleJob,下一章我們討論下DataflowJob。