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