欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析

 更新時間:2020年08月13日 09:13:26   作者:猿天地  
這篇文章主要介紹了Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

背景

在使用Elastic-Job的過程中,有很多人遇到了這么一個問題,就是如何動態(tài)的去添加任務(wù)?

在官方的文檔中也有對此作出回答,如下:

動態(tài)添加作業(yè)這個概念每個人理解不盡相同。

elastic-job-lite為jar包,由開發(fā)或運維人員負責(zé)啟動。啟動時自動向注冊中心注冊作業(yè)信息并進行分布式協(xié)調(diào),因此并不需要手工在注冊中心填寫作業(yè)信息。 但注冊中心與作業(yè)部署機無從屬關(guān)系,注冊中心并不能控制將單點的作業(yè)分發(fā)至其他作業(yè)機,也無法將遠程服務(wù)器未啟動的作業(yè)啟動。elastic-job-lite并不會包含ssh免密管理等功能。

elastic-job-cloud為mesos框架,由mesos負責(zé)作業(yè)啟動和分發(fā)。 但需要將作業(yè)打包上傳,并調(diào)用elastic-job-cloud提供的REST API寫入注冊中心。 打包上傳屬于部署系統(tǒng)的范疇elastic-job-cloud并未涉及。

綜上所述,elastic-job已做了基本動態(tài)添加功能,但無法做到真正意義的完全自動化添加。

接下來談?wù)勎覍討B(tài)任務(wù)的理解,我眼中的動態(tài)任務(wù)分為2種:

一種是全新的任務(wù),包括實現(xiàn)的邏輯也是全新的,也就是當(dāng)我們的程序打成一個jar包后,線上已經(jīng)在運行了,這個時候我加了一個新的任務(wù),如何能做到不停服務(wù),將這個任務(wù)集成到已有的任務(wù)中去,這個實現(xiàn)起來難度比較大,涉及到Java類的熱加載等,不過最近阿里又有一開源大作JarsLink,GitHub地址:https://github.com/alibaba/jarslink,可以支持在運行時動態(tài)加載到系統(tǒng)中,實現(xiàn)不需要重啟和發(fā)布系統(tǒng)新增功能。還有一種實現(xiàn)思路我們可以利用Groovy腳本來做這樣的事情,一般情況下重啟來發(fā)布新的任務(wù)會比較常見,如果各位一定要實現(xiàn)動態(tài)的任務(wù)可以自己嘗試著去研究下我提供的思路。

另一種就是執(zhí)行的業(yè)務(wù)邏輯不變,只是運行的時間發(fā)生變化。比如文章的定時發(fā)布,可以設(shè)置文章在某天的某分鐘進行自動發(fā)布,實現(xiàn)這個功能有多種方式,你可以不停的掃描任務(wù),一到時間點就自動發(fā)布,比較優(yōu)雅的方式就是為每篇文章的自動發(fā)布都設(shè)置一個任務(wù),通過Cron表達式來指定執(zhí)行時間,不同的是每個任務(wù)都有自己的參數(shù),業(yè)務(wù)邏輯都是固定的定時發(fā)布。
接下來我給大家介紹下Elastic-Job實現(xiàn)上面講的第二種動態(tài)任務(wù)的方式,也就是任務(wù)的實現(xiàn)邏輯已經(jīng)是存在的,只是需要發(fā)布成多個不同時間去觸發(fā)的任務(wù)。

實戰(zhàn)

實現(xiàn)任務(wù)的動態(tài)添加比較簡單,只需要接收任務(wù)的信息,然后初始化一下就可以了,在實現(xiàn)的過程中筆者遇到了一個麻煩的問題?

在多節(jié)點分片任務(wù)卻只有一個節(jié)點能執(zhí)行,問題原因在于當(dāng)有任務(wù)A和任務(wù)B,2個節(jié)點的時候,我們調(diào)用A節(jié)點的接口進行任務(wù)的動態(tài)添加,在A節(jié)點中初始化了任務(wù)調(diào)度器,數(shù)據(jù)也存儲到了注冊中心,但是B節(jié)點是不知道有新的任務(wù)添加,默認的使用方法是每個節(jié)點在啟動時去初始化任務(wù)調(diào)度器,而我們的B節(jié)點已經(jīng)啟動過了,任務(wù)是新添加的。

解決這個問題最簡單的方式就是將任務(wù)的節(jié)點都集中管理起來,無論動態(tài)任務(wù)在哪個節(jié)點上進行注冊,都需要將這個請求轉(zhuǎn)發(fā)到其他的節(jié)點上進行初始化操作,這樣就可以保證多節(jié)點分片的任務(wù)正常執(zhí)行。

還有一種對使用者更友好的辦法是對Zookeeper中的節(jié)點進行監(jiān)聽,當(dāng)有新的節(jié)點創(chuàng)建時,就自動獲取這個節(jié)點的配置信息,在本地進行任務(wù)初始化,通過這樣的方式就可以不用去轉(zhuǎn)發(fā)請求到其他節(jié)點了,只要在任何節(jié)點有添加操作,都能被監(jiān)聽到,并自己去初始化。

監(jiān)控代碼如下:

/**
 * 開啟任務(wù)監(jiān)聽,當(dāng)有任務(wù)添加時,監(jiān)聽zk中的數(shù)據(jù)增加,自動在其他節(jié)點也初始化該任務(wù)
 */
public void monitorJobRegister() {
  CuratorFramework client = zookeeperRegistryCenter.getClient();
  @SuppressWarnings("resource")
  PathChildrenCache childrenCache = new PathChildrenCache(client, "/", true); 
  PathChildrenCacheListener childrenCacheListener = new PathChildrenCacheListener() { 
  public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { 
    ChildData data = event.getData(); 
    switch (event.getType()) { 
        case CHILD_ADDED: 
          String config = new String(client.getData().forPath(data.getPath() + "/config"));
          Job job = JsonUtils.toBean(Job.class, config);
          addJob(job);
          break; 
        default: 
          break; 
    } 
   } 
 }; 
  childrenCache.getListenable().addListener(childrenCacheListener); 
  try { 
    childrenCache.start(StartMode.POST_INITIALIZED_EVENT);
  } catch (Exception e) {
    e.printStackTrace();
  } 
}

為了方便大家使用,我將動態(tài)添加任務(wù)的功能集成到了我之前的elastic-job-spring-boot-starter(https://github.com/yinjihuan/elastic-job-spring-boot-starter)中集成了動態(tài)添加的邏輯,大家引入依賴即可使用。

使用方式比較簡單,只需要在啟動類上加一個ComponentScan注解,讓Spring能夠掃描到elastic-job-spring-boot-starter提供的代碼即可:

@SpringBootApplication
@EnableElasticJob
//開啟動態(tài)任務(wù)添加API
@ComponentScan(basePackages = {"com.cxytiandi"})
public class JobApplication {
  public static void main(String[] args) {
    new SpringApplicationBuilder().sources(JobApplication.class).web(true).run(args);
    try {
      new CountDownLatch(1).await();
    } catch (InterruptedException e) {
    }
  }
}

配置好之后,啟動項目就可以通過REST API來動態(tài)的注冊任務(wù),API列表如下:

/job
添加任務(wù)是POST請求,數(shù)據(jù)格式為JSON體提交,格式如下:
{
"jobName":"DynamicJob13",
"cron":"0 33 16 ?",
"jobType":"SIMPLE",
"jobClass":"com.cxytiandi.job.demo.DynamicJob",
"jobParameter":"2222222",
"shardingTotalCount":1
}

完整字段請參考:

https://github.com/yinjihuan/elastic-job-spring-boot-starter/blob/master/spring-boot-elastic-job-starter/src/main/java/com/cxytiandi/elasticjob/dynamic/bean/Job.java

注意:jobClass必須事先存在于服務(wù)中
* /job/remove

刪除任務(wù)是GET請求,參數(shù)只要任務(wù)名稱即可,比如:/job/remove?jobName=任務(wù)名??梢杂糜谌蝿?wù)完成之后清空注冊中心的任務(wù)信息。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • RabbitMQ消息丟失解決方案

    RabbitMQ消息丟失解決方案

    把這篇文章主要為大家介紹了如何保證RabbitMQ消息不丟失的解決方發(fā),分從從丟失的三種情況給大家介紹不同的解決方案,感興趣的小伙伴可以參考閱讀本文
    2023-07-07
  • Java打亂ArrayList生成一個隨機序列列表

    Java打亂ArrayList生成一個隨機序列列表

    有時候會需要將一個ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機出題、答案選項打亂、連線題打亂、抽獎號碼打亂等等,把我自己寫的一段代碼貼出來分享給大家。
    2016-08-08
  • SpringBoot3集成WebSocket的全過程

    SpringBoot3集成WebSocket的全過程

    WebSocket通過一個TCP連接在客戶端和服務(wù)器之間建立一個全雙工、雙向的通信通道,使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,本文給大家介紹了SpringBoot3集成WebSocket的全過程,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-05-05
  • Java?空和null的區(qū)別

    Java?空和null的區(qū)別

    本文主要介紹了Java?空和null的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • Spring Boot 與 mybatis配置方法

    Spring Boot 與 mybatis配置方法

    這篇文章主要介紹了Spring Boot 與 mybatis配置方法,需要的朋友可以參考下
    2017-06-06
  • JVM核心教程之JVM運行與類加載全過程詳解

    JVM核心教程之JVM運行與類加載全過程詳解

    我們都知道一個java程序運行要經(jīng)過編譯和執(zhí)行,但是這太概括了,中間還有很多步驟,下面這篇文章主要給大家介紹了關(guān)于JVM核心教程之JVM運行與類加載全過程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2018-04-04
  • Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實例講解

    Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實例講解

    這篇文章主要介紹了Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實例,注意這里的雙端鏈表不是雙向鏈表,是在單鏈表的基礎(chǔ)上保存有對最后一個鏈接點的引用,需要的朋友可以參考下
    2016-04-04
  • java實現(xiàn)的各種排序算法代碼示例

    java實現(xiàn)的各種排序算法代碼示例

    這篇文章主要介紹了java實現(xiàn)的各種排序算法代碼示例,比較全面,代碼親測可用,如有不足之處,歡迎留言指出。
    2017-10-10
  • JAVA DOM解析XML文件過程詳解

    JAVA DOM解析XML文件過程詳解

    這篇文章主要介紹了JAVA DOM解析XML文件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 淺談@PostConstruct不被調(diào)用的原因

    淺談@PostConstruct不被調(diào)用的原因

    這篇文章主要介紹了淺談@PostConstruct不被調(diào)用的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論