溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java怎么實現(xiàn)一個流程編排框架

發(fā)布時間:2022-03-22 16:49:23 來源:億速云 閱讀:1898 作者:iii 欄目:大數(shù)據(jù)

今天小編給大家分享一下java怎么實現(xiàn)一個流程編排框架的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

流程注冊

之前有講到要支持yml、properties、xml、json、接口的形式注冊流程模型,為了體現(xiàn)職責(zé)單一原則,我們需要把一種格式解析的邏輯獨立處理,為了體現(xiàn)對擴展開發(fā),對修改關(guān)閉原則,我們先定義一組接口,然后通過工廠模式提供對應(yīng)的實現(xiàn)邏輯;這里工廠是使用者,通過接口調(diào)用具體的實現(xiàn),實現(xiàn)在這里是提供者,又是一組策略模式

java怎么實現(xiàn)一個流程編排框架

流程加載

流程加載我們需要知道其他的幾個需求功能點:1、提供對外統(tǒng)一訪問接口;2、提供執(zhí)行記錄和執(zhí)行耗時;3、不同流程節(jié)點需要定義不同的解析器;4、通過工廠創(chuàng)建解析類型;5、流程節(jié)點按照順序執(zhí)行。

java怎么實現(xiàn)一個流程編排框架

通過不同的節(jié)點類型執(zhí)行不同的解析方式,顯而易見這里需要用工廠模式去做解析類創(chuàng)建,而且需要做到對外擴展開發(fā)對修改關(guān)閉,新增節(jié)點不用動其他代碼邏輯,只要在工廠函數(shù)里面添加一個節(jié)點解析器;同時我們這里定義一個Map集合用于在加載工廠函數(shù)的時候就把解析對象創(chuàng)建,而不用每次解析的時候再去創(chuàng)建解析器,減少不必要的內(nèi)存

代碼如下:

public class NodeComponentFactory {

   private final static Map<String,NodeParser> cacheParser = new HashMap<>();

   static {
       cacheParser.put(NodeParserEnum.method.name(),new MethodNodeComponent());
       cacheParser.put(NodeParserEnum.bean.name(),new BeanNodeComponent());
       cacheParser.put(NodeParserEnum.condition.name(),new ConditionNodeComponent());
       cacheParser.put(NodeParserEnum.service.name(),new ServiceNodeComponent());
       cacheParser.put(NodeParserEnum.subflow.name(),new SubFlowNodeComponent());
   }

   public static NodeParser getNodeInstance(String nodeName){
       return cacheParser.get(nodeName);
   }
}

當(dāng)我們發(fā)現(xiàn)每一種節(jié)點解析類型都需要去實現(xiàn)parser接口,而且每個節(jié)點都有類似的步驟,那我們這里就要考慮用抽象工廠,也符合一個依賴倒置的的設(shè)計原則,上層模塊通過依賴接口訪問,下次模塊繼承抽象類,同時也用到了策略模式做接口調(diào)用;在實現(xiàn)的邏輯過程我們會發(fā)現(xiàn)很多步驟是重復(fù)的,比如初始化入?yún)?、?zhí)行記錄,所有我們把重復(fù)的內(nèi)容放到抽象類,通過模板模式的方式,讓流程節(jié)點只關(guān)注解析層面;

public abstract class AbstractNodeComponent implements NodeParser{

   public Map<String, Node> nodeMap;


   /**
    * 初始化參數(shù)
    * @param inputUrl
    * @param baseInput
    * @return
    */
   public BaseInput initInput(String inputUrl, BaseInput baseInput){
       BaseInput baseInputTarget = ClassUtil.newInstance(inputUrl, BaseInput.class);
       BeanUtils.copyProperties(baseInput,baseInputTarget);
       return baseInputTarget;
   }


   /**
    * 解析節(jié)點信息
    * @param node 節(jié)點信息
    * @param baseInput 請求參數(shù)
    * @param baseTemp 臨時上下文
    * @return
    */
   public BaseOutput parserNode(Node node, BaseInput baseInput, BaseTemp baseTemp){
       baseTemp.setFlowRecord(baseTemp.getFlowRecord().append(FlowConstants.NODEKEY+FlowConstants.NODE+FlowConstants.COLON+node.getId()));
       BaseOutput baseOutput = parser(node, baseInput, baseTemp);
       return baseOutput;
   };

   @Override
   public void setNodeMap(Map<String, Node> nodeMap) {
       this.nodeMap = nodeMap;
   }

   @Override
   public abstract BaseOutput parser(Node node, BaseInput baseInput, BaseTemp baseTemp);

}

流程加載順序

流程執(zhí)行我們需要把組件分的很細,最好是獨立實現(xiàn)一個功能的類劃分成一個組件,體現(xiàn)職責(zé)單一原則,也只要把執(zhí)行功能劃分的很細,才能在流程執(zhí)行的各個流程中靈活組合;在下面流程圖中可以看到幾個組件,第一個是流程統(tǒng)一執(zhí)行的入口,這里會有兩個地方會用到,第一個就是給外部調(diào)用的接口,第二個是子流程執(zhí)行的入口;第二個組件是節(jié)點統(tǒng)一加載管理組件也就是上文提到的工廠類;第三個就是每個組件自己的解析器,用于實現(xiàn)不同類型節(jié)點的操作;在設(shè)計的過程中一定知道 流程 、管理、節(jié)點之間的邊界,減少耦合,只有這樣不同的組件才能靈活組成。

java怎么實現(xiàn)一個流程編排框架

以上就是“java怎么實現(xiàn)一個流程編排框架”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI