elastic-job 源碼解讀之從源碼看zookeeper節(jié)點的監(jiān)控

? elasticjob是使用zk做分布式協(xié)調(diào)颤殴,包括分片參數(shù)配置,再分片二拐,選主節(jié)點服鹅,作業(yè)狀態(tài)等一系列配置和運行狀態(tài)的數(shù)據(jù)都是保存在zk中,包括console是直接通過修改zk節(jié)點數(shù)據(jù)百新,使配置項直接生效的企软。
那么,當(dāng)zk節(jié)點參數(shù)發(fā)生變化吟孙,elasticJob是如何感知的澜倦?


ListenerManager.png

? 在初始化JobScheduler對象中的schedulerFacade該屬性的時候,構(gòu)造方法中曾經(jīng)初始化過ListenterManager杰妓,該對象主要做了一件事情,就是監(jiān)控各zk節(jié)點數(shù)據(jù)的變化碘勉。
? 在這張圖中巷挥,能看到所有的對zk節(jié)點監(jiān)控的listener都是通過一些Listener去實現(xiàn)的⊙槊遥看類圖:

zk監(jiān)聽.png

從類圖上看倍宾,所有的zk節(jié)點的監(jiān)控都是實現(xiàn)TreeCacheListener接口的雏节,那么TreeCacheListener這個接口到底是什么?

? 在curator中高职,提供了三種緩存方式钩乍,PathCache,NodeCache怔锌,TreeCache寥粹,并支持對這三種緩存做監(jiān)控,進而間接監(jiān)控了zk節(jié)點埃元。分別如下:

  • Path Cache 可以監(jiān)控某個節(jié)點的子節(jié)點
    • PathChildrenCacheListener 節(jié)點監(jiān)聽器接口
  • Node Cache 監(jiān)控某一個特定節(jié)點
    • NodeCacheListener 節(jié)點監(jiān)聽器接口
  • Tree Cache 除了監(jiān)控節(jié)點涝涤,還可以監(jiān)控該節(jié)點的子節(jié)點,像Path Cache和Node Cache的組合岛杀,監(jiān)控整個樹
    • TreeCacheListener 節(jié)點監(jiān)聽器接口

? 再回頭看看上篇博客阔拳,在elastic-Job中,是使用treeCache去緩存數(shù)據(jù)的类嗤,并且在JobScheduler.init()方法中糊肠,調(diào)用了JobRegistry.getInstance().registerJob()方法,該方法里又調(diào)用了regCenter.addCacheData("/" + jobName);

 
 public void init() {
        LiteJobConfiguration liteJobConfigFromRegCenter = schedulerFacade.updateJobConfiguration(liteJobConfig);
  JobRegistry.getInstance().setCurrentShardingTotalCount(liteJobConfigFromRegCenter.getJobName(), liteJobConfigFromRegCenter.getTypeConfig().getCoreConfig().getShardingTotalCount());
        JobScheduleController jobScheduleController = new JobScheduleController(
                createScheduler(), createJobDetail(liteJobConfigFromRegCenter.getTypeConfig().getJobClass()), liteJobConfigFromRegCenter.getJobName());
        //在這里注冊作業(yè)遗锣,添加TreeCache
        JobRegistry.getInstance().registerJob(liteJobConfigFromRegCenter.getJobName(), jobScheduleController, regCenter);
        schedulerFacade.registerStartUpInfo(!liteJobConfigFromRegCenter.isDisabled());
 jobScheduleController.scheduleJob(liteJobConfigFromRegCenter.getTypeConfig().getCoreConfig().getCron());
  }

public void registerJob(final String jobName, final JobScheduleController jobScheduleController, final CoordinatorRegistryCenter regCenter) {
        schedulerMap.put(jobName, jobScheduleController);
        regCenterMap.put(jobName, regCenter);
        //添加一條TreeCache
        regCenter.addCacheData("/" + jobName);
    }

? 在作業(yè)注冊的時候添加了一個treeCache罪针,實現(xiàn)對這個jobname命名的節(jié)點及其子節(jié)點監(jiān)控。所以黄伊,當(dāng)該節(jié)點及其子節(jié)點發(fā)生變化泪酱,所有監(jiān)聽該treeCache的Listener都會有感知。各個Listenter根據(jù)自己的邏輯判斷是否是該節(jié)點變化还最,EventType是不是自己關(guān)心的類型等等做自己的義務(wù)邏輯墓阀。

class CronSettingAndJobEventChangedJobListener extends AbstractJobListener {
        
        @Override
        protected void dataChanged(final String path, final Type eventType, final String data) {
            if (configNode.isConfigPath(path) && Type.NODE_UPDATED == eventType && !JobRegistry.getInstance().isShutdown(jobName)) {
                JobRegistry.getInstance().getJobScheduleController(jobName).rescheduleJob(LiteJobConfigurationGsonFactory.fromJson(data).getTypeConfig().getCoreConfig().getCron());
            }
        }
    }

     //AbstractListenerManager.java
    protected void addDataListener(final TreeCacheListener listener) {
        jobNodeStorage.addDataListener(listener);
    }
  //JobNodeStorage.java
  public void addDataListener(final TreeCacheListener listener) {
        TreeCache cache = (TreeCache) regCenter.getRawCache("/" + jobName);
        cache.getListenable().addListener(listener);
    }

比如,CronSettingAndJobEventChangedJobListener該Listener拓轻,當(dāng)節(jié)點數(shù)據(jù)發(fā)生變化斯撮,比如修改了zk上保存的cron表達式,首先該Listener會去判斷是不是config節(jié)點扶叉,該節(jié)點發(fā)生的類型是否是update類型勿锅,是否又修改過節(jié)點信息,該job是不是已經(jīng)停止枣氧,倘若符合這幾個條件溢十,就重啟rescheduleJob該作業(yè)對應(yīng)的調(diào)度器,使job的相關(guān)配置重新生效达吞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末张弛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吞鸭,老刑警劉巖寺董,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刻剥,居然都是意外死亡遮咖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門造虏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來御吞,“玉大人,你說我怎么就攤上這事酗电∑桥海” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵撵术,是天一觀的道長背率。 經(jīng)常有香客問我,道長嫩与,這世上最難降的妖魔是什么寝姿? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮划滋,結(jié)果婚禮上饵筑,老公的妹妹穿的比我還像新娘。我一直安慰自己处坪,他們只是感情好根资,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著同窘,像睡著了一般玄帕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想邦,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天裤纹,我揣著相機與錄音,去河邊找鬼丧没。 笑死鹰椒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呕童。 我是一名探鬼主播漆际,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拉庵!你這毒婦竟也來了灿椅?” 一聲冷哼從身側(cè)響起套蒂,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钞支,失蹤者是張志新(化名)和其女友劉穎茫蛹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烁挟,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡婴洼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撼嗓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬采。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖且警,靈堂內(nèi)的尸體忽然破棺而出粉捻,到底是詐尸還是另有隱情,我是刑警寧澤斑芜,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布肩刃,位于F島的核電站,受9級特大地震影響杏头,放射性物質(zhì)發(fā)生泄漏盈包。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一醇王、第九天 我趴在偏房一處隱蔽的房頂上張望呢燥。 院中可真熱鬧,春花似錦寓娩、人聲如沸叛氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞埠。三九已至,卻和暖如春排嫌,著一層夾襖步出監(jiān)牢的瞬間畸裳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工淳地, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怖糊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓颇象,卻偏偏與公主長得像伍伤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遣钳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容