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