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