首頁 >Java >java教程 >java怎麼實作一個流程編排框架

java怎麼實作一個流程編排框架

王林
王林轉載
2023-05-01 21:49:052639瀏覽

流程註冊

之前有講到要支援yml、properties、xml、json、介面的形式註冊流程模型,為了體現職責單一原則,我們需要把一種格式解析的邏輯獨立處理,為了體現對擴展開發,對修改關閉原則,我們先定義一組接口,然後通過工廠模式提供對應的實現邏輯;這裡工廠是使用者,透過介面呼叫具體的實現,實現在這裡是提供者,又是一組策略模式

java怎麼實作一個流程編排框架

流程載入

流程載入我們需要知道其他的幾個需求功能點:1、提供對外統一存取介面;2、提供執行記錄和執行耗時;3、不同流程節點需要定義不同的解析器;4、透過工廠建立解析類型;5、流程節點依照順序執行。

java怎麼實作一個流程編排框架

透過不同的節點類型執行不同的解析方式,顯而易見這裡需要用工廠模式去做解析類別創建,而且需要做到對外擴充開發對修改關閉,新增節點不用動其他程式碼邏輯,只要在工廠函數裡面加入一個節點解析器;同時我們這裡定義一個Map集合用於在載入工廠函數的時候就把解析對象創建,而不用每次解析的時候再去創建解析器,減少不必要的內存

代碼如下:

<code>public class NodeComponentFactory {<br><br>    private final static Map<string> cacheParser = new HashMap();<br><br>    static {<br>        cacheParser.put(NodeParserEnum.method.name(),new MethodNodeComponent());<br>        cacheParser.put(NodeParserEnum.bean.name(),new BeanNodeComponent());<br>        cacheParser.put(NodeParserEnum.condition.name(),new ConditionNodeComponent());<br>        cacheParser.put(NodeParserEnum.service.name(),new ServiceNodeComponent());<br>        cacheParser.put(NodeParserEnum.subflow.name(),new SubFlowNodeComponent());<br>    }<br><br>    public static NodeParser getNodeInstance(String nodeName){<br>        return cacheParser.get(nodeName);<br>    }<br>}<br></string></code>

當我們發現每一種節點解析類型都需要去實現parser接口,而且每個節點都有類似的步驟,那我們這裡就要考慮用抽象工廠,也符合一個依賴倒置的的設計原則,上層模組透過依賴接口訪問,下次模組繼承抽象類,同時也用到了策略模式做介面呼叫;在實現的邏輯過程我們會發現很多步驟是重複的,例如初始化入參、執行記錄,所有我們把重複的內容放到抽象類,透過模板模式的方式,讓流程節點只專注於解析層面;

<code>public abstract class AbstractNodeComponent implements NodeParser{<br><br>    public Map<string node> nodeMap;<br><br><br>    /**<br>     * 初始化参数<br>     * @param inputUrl<br>     * @param baseInput<br>     * @return<br>     */<br>    public BaseInput initInput(String inputUrl, BaseInput baseInput){<br>        BaseInput baseInputTarget = ClassUtil.newInstance(inputUrl, BaseInput.class);<br>        BeanUtils.copyProperties(baseInput,baseInputTarget);<br>        return baseInputTarget;<br>    }<br><br><br>    /**<br>     * 解析节点信息<br>     * @param node 节点信息<br>     * @param baseInput 请求参数<br>     * @param baseTemp 临时上下文<br>     * @return<br>     */<br>    public BaseOutput parserNode(Node node, BaseInput baseInput, BaseTemp baseTemp){<br>        baseTemp.setFlowRecord(baseTemp.getFlowRecord().append(FlowConstants.NODEKEY+FlowConstants.NODE+FlowConstants.COLON+node.getId()));<br>        BaseOutput baseOutput = parser(node, baseInput, baseTemp);<br>        return baseOutput;<br>    };<br><br>    @Override<br>    public void setNodeMap(Map<string node> nodeMap) {<br>        this.nodeMap = nodeMap;<br>    }<br><br>    @Override<br>    public abstract BaseOutput parser(Node node, BaseInput baseInput, BaseTemp baseTemp);<br><br>}</string></string></code>

流程載入順序

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

java怎麼實作一個流程編排框架

以上是java怎麼實作一個流程編排框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除