摘要:動(dòng)態(tài)腳本支持框架之結(jié)構(gòu)設(shè)計(jì)篇相關(guān)博文動(dòng)態(tài)腳本支持框架整體介紹篇?jiǎng)討B(tài)腳本支持框架之使用介紹篇前面兩篇博文,主要是整體介紹和如何使用接下來開始進(jìn)入正題,逐步剖析,這個(gè)項(xiàng)目是怎么一步一步搭建起來的本篇博文則主要介紹基本骨架的設(shè)計(jì),圍繞項(xiàng)目
Quick-Task 動(dòng)態(tài)腳本支持框架之結(jié)構(gòu)設(shè)計(jì)篇
相關(guān)博文:
180702-QuickTask動(dòng)態(tài)腳本支持框架整體介紹篇
180719-Quick-Task 動(dòng)態(tài)腳本支持框架之使用介紹篇
前面兩篇博文,主要是整體介紹和如何使用;接下來開始進(jìn)入正題,逐步剖析,這個(gè)項(xiàng)目是怎么一步一步搭建起來的;本篇博文則主要介紹基本骨架的設(shè)計(jì),圍繞項(xiàng)目的核心點(diǎn),實(shí)現(xiàn)一個(gè)基礎(chǔ)的原型系統(tǒng)
I. 結(jié)構(gòu)分析整體設(shè)計(jì)圖如下:
對(duì)于上面的圖,得有一個(gè)基本的認(rèn)知,最好是能在腦海中構(gòu)想出整個(gè)框架運(yùn)行的方式,在正式開始之前,先簡(jiǎn)單的過一下這張結(jié)構(gòu)圖
抓要點(diǎn)
1. 任務(wù)執(zhí)行單元即圖中的每個(gè)task就表示一個(gè)基本的任務(wù),有下面幾個(gè)要求
統(tǒng)一的繼承關(guān)系(面向?qū)ο蟮脑O(shè)計(jì)理念,執(zhí)行同一個(gè)角色的類由某個(gè)抽象的接口繼承而來)
任務(wù)的執(zhí)行之間是沒有關(guān)系的(即任務(wù)在獨(dú)立的線程中調(diào)度執(zhí)行)
2. 任務(wù)隊(duì)列在圖中表現(xiàn)很明顯了,在內(nèi)存中會(huì)保存一個(gè)當(dāng)前所有執(zhí)行的任務(wù)隊(duì)列(或者其他的容器)
這個(gè)的目的是什么?
任務(wù)腳本更新時(shí),需要卸載舊的任務(wù)(因此可以從隊(duì)列中找到舊的任務(wù),并停掉)
任務(wù)腳本刪除時(shí),需要卸載舊的任務(wù)
3. 任務(wù)管理者雖然圖中并沒有明確的說有這么個(gè)東西,但也好理解,我們的系統(tǒng)設(shè)計(jì)目標(biāo)就是支持多任務(wù)的執(zhí)行和熱加載,那么肯定有個(gè)任務(wù)管理的角色,來處理這些事情
其要做的事情就一個(gè)任務(wù)熱加載
包括動(dòng)態(tài)腳本更新,刪除,新增的事件監(jiān)聽
實(shí)現(xiàn)卸載內(nèi)存中舊的任務(wù)并加載執(zhí)行新的任務(wù)
4. 插件系統(tǒng)這個(gè)與核心功能關(guān)系不大,可以先不care,簡(jiǎn)單說一下就是為task提供更好的使用的公共類
這里不詳細(xì)展開,后面再說
II. 設(shè)計(jì)實(shí)現(xiàn)有了上面的簡(jiǎn)單認(rèn)知之后,開始進(jìn)入正題,編碼環(huán)節(jié),省略掉創(chuàng)建工程等步驟,第一步就是設(shè)計(jì)Task的API
1. ITask設(shè)計(jì)抽象公共的任務(wù)接口,從任務(wù)的標(biāo)識(shí)區(qū)分,和業(yè)務(wù)調(diào)度執(zhí)行,很容易寫出下面的實(shí)現(xiàn)
public interface ITask { /** * 默認(rèn)將task的類名作為唯一標(biāo)識(shí) * * @return */ default String name() { return this.getClass().getName(); } /** * 開始執(zhí)行任務(wù) */ void run(); /** * 任務(wù)中斷 */ default void interrupt() {} }
前面兩個(gè)好理解,中斷這個(gè)接口的目的何在?主要是出于任務(wù)結(jié)束時(shí)的收尾操作,特別是在使用到流等操作時(shí),有這么個(gè)回調(diào)就比較好了
2. TaskDecorate任務(wù)裝飾類,為什么有這么個(gè)東西?出于什么考慮的?
從上面可以知道,所有的任務(wù)最終都是在獨(dú)立的線程中調(diào)度執(zhí)行,那么我們自己實(shí)現(xiàn)的Task肯定都是會(huì)封裝到線程中的,在Java中可以怎么起一個(gè)線程執(zhí)行呢?
一個(gè)順其自然的想法就是包裝一下ITask接口,讓它集成自Thread,然后就可以簡(jiǎn)單的直接將任務(wù)丟到線程池中即可
@Slf4j public class ScriptTaskDecorate extends Thread { private ITask task; public ScriptTaskDecorate(ITask task) { this.task = task; setName(task.name()); } @Override public void run() { try { task.run(); } catch (Exception e) { log.error("script task run error! task: {}", task.name()); } } @Override public void interrupt() { task.interrupt(); } }
說明:
上面這個(gè)并不是必須的,你也完全可以自己在線程池調(diào)度Task任務(wù)時(shí),進(jìn)行硬編碼風(fēng)格的封裝調(diào)用,完全沒有問題(只是代碼將不太好看而已)
3. TaskContainer上面兩個(gè)是具體的任務(wù)相關(guān)定義接口,接下來就是維護(hù)這些任務(wù)的容器了,最簡(jiǎn)單的就是用一個(gè)Map來保存,uuid到task的映射關(guān)系,然后再需要卸載/更新任務(wù)時(shí),停掉舊的,添加新的任務(wù),對(duì)應(yīng)的實(shí)現(xiàn)也比較簡(jiǎn)單
public class TaskContainer { /** * key: com.git.hui.task.api.ITask#name() */ private static MaptaskCache = new ConcurrentHashMap<>(); /** * key: absolute script path * * for task to delete */ private static Map pathCache = new ConcurrentHashMap<>(); public static void registerTask(String path, ScriptTaskDecorate task) { ScriptTaskDecorate origin = taskCache.get(task.getName()); if (origin != null) { origin.interrupt(); } taskCache.put(task.getName(), task); pathCache.put(path, task); AsynTaskManager.addTask(task); } public static void removeTask(String path) { ScriptTaskDecorate task = pathCache.get(path); if (task != null) { task.interrupt(); taskCache.remove(task.getName()); pathCache.remove(path); } } }
說明
為什么有兩個(gè)map,一個(gè)唯一標(biāo)識(shí)name為key,一個(gè)是task的全路徑為key?
刪除任務(wù)時(shí),是直接刪除文件,所以需要維護(hù)一個(gè)pathCache
維護(hù)name的映射,主要是基于任務(wù)的唯一標(biāo)識(shí)出發(fā)的,后續(xù)可能借此做一些擴(kuò)展(比如任務(wù)和任務(wù)之間的關(guān)聯(lián)等)
4. 任務(wù)注冊(cè)前面介紹了任務(wù)的定義和裝載任務(wù)的容器,接下來可以想到的就是如何發(fā)現(xiàn)任務(wù)并注冊(cè)了,這一塊這里不要詳細(xì)展開,后面另起一篇詳解;主要說一下思路
在設(shè)計(jì)之初,就決定任務(wù)采用Groovy腳本來實(shí)現(xiàn)熱加載,所以有兩個(gè)很容易想到的功能點(diǎn)
監(jiān)聽Groovy腳本的變動(dòng)(新增,更新,刪除),對(duì)應(yīng)的類為 TaskChangeWatcher
加載Groovy腳本到內(nèi)存,并執(zhí)行,對(duì)應(yīng)的類為 GroovyCompile
5. 執(zhí)行流程有了上面四個(gè)是否可以搭建一個(gè)原型框架呢?
答案是可以的,整個(gè)框架的運(yùn)行過程
程序啟動(dòng),注冊(cè)Groovy腳本變動(dòng)監(jiān)聽器
加載groovy腳本,注冊(cè)到TaskContainer
將groovy腳本丟到線程池中調(diào)度執(zhí)行
執(zhí)行完畢后,清除和回收現(xiàn)場(chǎng)
6. 其他當(dāng)然其他一些輔助的工具類可有可無了,當(dāng)然從使用的角度出發(fā),有很多東西還是很有必要的,如
通用的日志輸出組件(特別是日志輸出,收集,檢索,經(jīng)典的ELK場(chǎng)景)
報(bào)警相關(guān)組件
監(jiān)控相關(guān)
redis緩存工具類
dao工具類
mq消費(fèi)工具類
http工具類
其他
III. 其他 0. 相關(guān)博文:
180628-動(dòng)態(tài)任務(wù)執(zhí)行框架想法篇
180702-QuickTask動(dòng)態(tài)腳本支持框架整體介紹篇
項(xiàng)目:
https://github.com/liuyueyi/quick-task
1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個(gè)人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內(nèi)容,純屬一家之言,因個(gè)人能力有限,難免有疏漏和錯(cuò)誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評(píng)指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關(guān)注文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/76460.html
摘要:動(dòng)態(tài)腳本支持框架之腳本加載執(zhí)行上一篇簡(jiǎn)答說了如何判斷有任務(wù)動(dòng)態(tài)添加刪除或更新,歸于一點(diǎn)就是監(jiān)聽文件的變化,判斷目錄下的文件是否有新增刪除和改變,從而判定是否有任務(wù)的變更接下來的問題就比較明顯了,當(dāng)任務(wù)變更之后,就需要重新加載任務(wù)了,即如何 showImg(https://segmentfault.com/img/remote/1460000015923148); Quick-Task ...
摘要:動(dòng)態(tài)腳本支持框架之任務(wù)動(dòng)態(tài)加載前面幾篇博文分別介紹了整個(gè)項(xiàng)目的基本架構(gòu),使用說明,以及整體框架的設(shè)計(jì)與實(shí)現(xiàn)初稿,接下來則進(jìn)入更細(xì)節(jié)的實(shí)現(xiàn)篇,將整個(gè)工程中核心實(shí)現(xiàn)撈出來,從為什么這么設(shè)計(jì)到最終的實(shí)現(xiàn)給予說明相關(guān)系列博文動(dòng)態(tài)腳本支持框架整體 showImg(https://segmentfault.com/img/remote/1460000015806174); Quick-Task 動(dòng)...
摘要:文章鏈接動(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...
摘要:軟件測(cè)試江湖二神兵利器篇在上一篇文章中我們介紹了江湖上流傳的各種軟件測(cè)試的武功秘籍和心法,相信看過的小伙伴內(nèi)力得到了很大的提升。功能測(cè)試篇功能測(cè)試,是軟件測(cè)試?yán)锏娜腴T級(jí)心法,自然也有與之相對(duì)應(yīng)的兵器來發(fā)揮心法的最大功力。 軟件測(cè)試江湖(二)神兵利器篇 在上一篇文章中我們介紹了江湖上流傳的各種軟件測(cè)試的武功秘籍和心法,相信看過的小伙伴內(nèi)力得到了很大的提升。如果沒有,一定是你看的姿勢(shì)不對(duì),...
閱讀 3166·2021-11-23 09:51
閱讀 678·2021-10-14 09:43
閱讀 3200·2021-09-06 15:00
閱讀 2403·2019-08-30 15:54
閱讀 2557·2019-08-30 13:58
閱讀 1840·2019-08-29 13:18
閱讀 1372·2019-08-27 10:58
閱讀 506·2019-08-27 10:53