电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:4日期:2022-08-27 11:16:15

背景

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

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

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

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

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

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

接下來談談我對動態(tài)任務的理解,我眼中的動態(tài)任務分為2種:

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

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

實戰(zhàn)

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

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

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

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

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

/** * 開啟任務監(jiān)聽,當有任務添加時,監(jiān)聽zk中的數(shù)據(jù)增加,自動在其他節(jié)點也初始化該任務 */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)添加任務的功能集成到了我之前的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)任務添加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)的注冊任務,API列表如下:

/job添加任務是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必須事先存在于服務中* /job/remove

刪除任務是GET請求,參數(shù)只要任務名稱即可,比如:/job/remove?jobName=任務名??梢杂糜谌蝿胀瓿芍笄蹇兆灾行牡娜蝿招畔?。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 贴片电容-贴片电阻-二三极管-国巨|三星|风华贴片电容代理商-深圳伟哲电子 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 脱硫搅拌器厂家-淄博友胜不锈钢搅拌器厂家 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 中山市派格家具有限公司【官网】| 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 不干胶标签,不干胶标签纸_厂家-山东同力胶粘制品 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 陕西高职单招-陕西高职分类考试网| 手术室净化厂家-成都做医院净化工程的公司-四川华锐-15年特殊科室建设经验 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 合肥角钢_合肥槽钢_安徽镀锌管厂家-昆瑟商贸有限公司 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 |