摘要:動態(tài)腳本支持框架之腳本加載執(zhí)行上一篇簡答說了如何判斷有任務(wù)動態(tài)添加刪除或更新,歸于一點就是監(jiān)聽文件的變化,判斷目錄下的文件是否有新增刪除和改變,從而判定是否有任務(wù)的變更接下來的問題就比較明顯了,當(dāng)任務(wù)變更之后,就需要重新加載任務(wù)了,即如何
Quick-Task 動態(tài)腳本支持框架之Groovy腳本加載執(zhí)行
上一篇簡答說了如何判斷有任務(wù)動態(tài)添加、刪除或更新,歸于一點就是監(jiān)聽文件的變化,判斷目錄下的Groovy文件是否有新增刪除和改變,從而判定是否有任務(wù)的變更;
接下來的問題就比較明顯了,當(dāng)任務(wù)變更之后,就需要重新加載任務(wù)了,即如何動態(tài)的編譯并執(zhí)行Groovy文件呢?
相關(guān)系列博文:
180628-Quick-Task 動態(tài)任務(wù)執(zhí)行框架想法篇
180702-Quick-Task 動態(tài)腳本支持框架整體介紹篇
180723-Quick-Task 動態(tài)腳本支持框架之結(jié)構(gòu)設(shè)計篇
180729-Quick-Task 動態(tài)腳本支持框架之任務(wù)動態(tài)加載
I. Groovy文件動態(tài)加載要想動態(tài)加載類,可以怎么辦?如果對JVM有一定了解的朋友可能知道,自定義一個ClassLoader,可以實現(xiàn)從文件/網(wǎng)絡(luò)/DB/Jar包中讀取class文件,而Groovy,動態(tài)語言,簡單來說就是.groovy文件可以直接運行,那么我們編碼中要怎么玩?
1. 依賴讓我自己來實現(xiàn)Groovy文件的編譯執(zhí)行,目前基本上是看不到啥希望的,所以果斷的借助第三方工具類加載Groovy文件
pom文件添加依賴
2. 加載Groovyorg.codehaus.groovy groovy-all 2.4.3
直接利用上面jar包中提供的GroovyCalssLoader來加載Groovy文件即可,使用也比較簡單
@Slf4j public class GroovyCompile { @SuppressWarnings("unchecked") public staticT compile(File codeSource, Class interfaceType, ClassLoader classLoader) throws CompileTaskScriptException { try { GroovyClassLoader loader = new GroovyClassLoader(classLoader); Class clz = loader.parseClass(codeSource); // 接口校驗 if (!interfaceType.isAssignableFrom(clz)) { throw new CompileTaskScriptException("illegal script type!"); } return (T) clz.newInstance(); } catch (IOException e) { log.error("load code from {} error! e: {}", codeSource, e); throw new CompileTaskScriptException("load code from " + codeSource + " error!"); } catch (CompileTaskScriptException e) { throw e; } catch (Exception e) { log.error("initial script error! codePath: {}, e: {}", codeSource, e); throw new CompileTaskScriptException( "initial script error! clz: " + codeSource + " msg: " + e.getMessage()); } } }
上面看著挺多,關(guān)鍵地方就三行,編譯為class對象之后,借助反射來創(chuàng)建對象
GroovyClassLoader loader = new GroovyClassLoader(classLoader); Class clz = loader.parseClass(codeSource); return (T) clz.newInstance();
另外還有一行,也可以順帶湊一眼,判斷一個class是否為另一個class的子類,用的是
interfaceType.isAssignableFrom(clz)
而判斷某個對象是否為某類的子類用的則是 instance of
3. 調(diào)用包裝上面既然提供了一個工具類,那么接上篇的獲取變動文件之后,獲取File對象,借此拿到任務(wù)對象,就比較清晰了
@Slf4j public class ScriptLoadUtil { public static ITask loadScript(File file) { try { return GroovyCompile.compile(file, ITask.class, ScriptLoadUtil.class.getClassLoader()); } catch (CompileTaskScriptException e) { log.error("un-expect error! e: {}", e); return null; } } }4. 小結(jié)
本篇內(nèi)容比較簡單,知識點也沒多少,一個是利用GroovyClassLoader來編譯Groovy文件并獲取實例;另一個就是如何判斷一個class是否為另一個class的子類
還有一個隱藏的點上面沒有說,那就是上面的GroovyCompile文件中,每次加載Groovy文件時,都是新創(chuàng)建了一個GroovyClassLoader,并由它來加載并實例Groovy任務(wù),那么問題來了
能否用一個GoorvyClassLoader來管理所有的Groovy任務(wù)呢?
上面的代碼實現(xiàn)中,不同的Groovy任務(wù)之間,可以相互通信么?
針對上面的問題,暫不給出答案,后面再說
II. 其他 0. 相關(guān)博文:
180628-Quick-Task 動態(tài)任務(wù)執(zhí)行框架想法篇
180702-Quick-Task 動態(tài)腳本支持框架整體介紹篇
180723-Quick-Task 動態(tài)腳本支持框架之結(jié)構(gòu)設(shè)計篇
180729-Quick-Task 動態(tài)腳本支持框架之任務(wù)動態(tài)加載
項目:
https://github.com/liuyueyi/quick-task
1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內(nèi)容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關(guān)注小灰灰Blog&公眾號
知識星球
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76649.html
摘要:動態(tài)腳本支持框架之結(jié)構(gòu)設(shè)計篇相關(guān)博文動態(tài)腳本支持框架整體介紹篇動態(tài)腳本支持框架之使用介紹篇前面兩篇博文,主要是整體介紹和如何使用接下來開始進(jìn)入正題,逐步剖析,這個項目是怎么一步一步搭建起來的本篇博文則主要介紹基本骨架的設(shè)計,圍繞項目 showImg(https://segmentfault.com/img/remote/1460000015739044); Quick-Task 動態(tài)腳...
摘要:文章鏈接動態(tài)腳本支持框架之使用介紹篇動態(tài)腳本支持框架之使用介紹篇相關(guān)博文動態(tài)腳本支持框架整體介紹篇這個項目主要就是為了解決數(shù)據(jù)訂正和接口驗證不方便的場景,設(shè)計的一個及其簡單的動態(tài)腳本調(diào)度框架,前面一篇整體介紹篇博文,主要介紹了這是 showImg(https://segmentfault.com/img/remote/1460000015698572); 文章鏈接:https://li...
摘要:措施將解析功能模塊化,獨立于業(yè)務(wù)流程利用的加載器,加載外部腳本該腳本放在數(shù)據(jù)庫中類圖說明功能觸發(fā)后目前為定時任務(wù)驅(qū)動,從配置表獲取需要解析的對象信息,根據(jù)配置選擇相應(yīng)的解析器實現(xiàn)類接口實現(xiàn)解析文件的功能。 起因 項目上有用到文件解析的功能,一個txt對賬文件,逐行讀取數(shù)據(jù)并處理落庫。不同的渠道,其文件內(nèi)容、格式等差異可能較大,落庫及后續(xù)處理方式也或許不同。雖然目前使用了策略模式以求保持...
摘要:動態(tài)編程使用場景通過配置生成代碼,減少重復(fù)編碼,降低維護(hù)成本。動態(tài)生成字節(jié)碼操作字節(jié)碼的工具有,其中有兩個比較流行的,一個是,一個是。 作者簡介 傳恒,一個喜歡攝影和旅游的軟件工程師,先后從事餓了么物流蜂鳥自配送和蜂鳥眾包的開發(fā),現(xiàn)在轉(zhuǎn)戰(zhàn) Java,目前負(fù)責(zé)物流策略組分流相關(guān)業(yè)務(wù)的開發(fā)。 什么是動態(tài)編程 動態(tài)編程是相對于靜態(tài)編程而言的,平時我們討論比較多的靜態(tài)編程語言例如Java, 與動態(tài)...
摘要:框架是和應(yīng)用程序的另一個測試和規(guī)范框架。它是為應(yīng)用程序編寫自動測試的最有用的庫之一。數(shù)據(jù)庫是許多應(yīng)用程序包括核心和應(yīng)用程序不可分割的一部分,可能是進(jìn)行單元測試時的最大障礙。 作為一名Java開發(fā)人員,我們從事不同的領(lǐng)域,從編寫核心Java代碼到創(chuàng)建JSP頁面、編寫RESTAPI,有時甚至創(chuàng)建Groovy腳本以實現(xiàn)構(gòu)建自動化...
閱讀 2638·2021-11-25 09:43
閱讀 2739·2021-11-04 16:09
閱讀 1656·2021-10-12 10:13
閱讀 890·2021-09-29 09:35
閱讀 891·2021-08-03 14:03
閱讀 1784·2019-08-30 15:55
閱讀 3000·2019-08-28 18:14
閱讀 3502·2019-08-26 13:43