1. 程式人生 > >Urule開源版系列4——Core包核心介面之規則解析過程

Urule開源版系列4——Core包核心介面之規則解析過程

> Urule執行規則檔案,是如何進行的,通過一個請求doTest來探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler.doTest()方法執行測試規則,接受3個引數: data-測試資料;files- 規則檔名稱及版本;flowId- 規則中包含流程有效,流程id。 ``` java public void doTest(HttpServletRequest req, HttpServletResponse resp) throws Exception { ... KnowledgeBase knowledgeBase=(KnowledgeBase)httpSessionKnowledgeCache.get(req, KB_KEY); if(knowledgeBase==null){ knowledgeBase=buildKnowledgeBase(req); } KnowledgePackage knowledgePackage=knowledgeBase.getKnowledgePackage(); KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage); ... } ``` KnowledgeBase 類似Drools中的概念,是一個知識庫集合,包含規則、流程、引數變數定義等。規則呼叫的統一對外facade。 這裡重點看buildKnowledgeBase方法 AbstractBuilder ## 2 PackageServletHandler.buildKnowledgeBase buildKnowledgeBase 的邏輯分為3段:1. 解析req中規則檔名稱及版本;2. 解析規則;3. 快取。 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831182116991-1905966364.png) 進一步看: KnowledgeBase knowledgeBase=knowledgeBuilder.buildKnowledgeBase(resourceBase); 這一行 ## 3 KnowledgeBuilder.buildKnowledgeBase 核心流程: 1. 迴圈資原始檔,使用com.bstek.urule.builder.resource.Resource介面實現 2. 如果規則是UL(規則文字檔案),直接載入。 3. 其他均為xml定義,使用ResourceProvider載入檔案或資料庫中的xml檔案 4. 迴圈呼叫resourceBuilders,解析xml到各類規則檔案中 5. 構建Rete樹 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831183647467-1334367398.png) ## ResourceBuilder 解析規則,從xml中解析為規則模型,介面有10個實現,分別對應頁面可新增的10中規則、庫檔案。 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831183756736-1572182802.png) ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831184058411-1578644465.png) ## RuleSetResourceBuilder 為例解析解析過程 ResouceBuilder通過Deserializer介面對parse介面完成適配。 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831184306710-157144516.png) ## Parser Parse介面負責xml解析,接受dom4j輸入,解析為規則或庫檔案例項 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831184333786-1669724502.png) 解析過程,就是一個遞迴規程,根據xml檔案的標記屬性名稱,裝配規則物件例項。實現與Spring的XmlBeanFactory有相似也不同。 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831184406146-1117263427.png) # 總結 ![](https://img2020.cnblogs.com/blog/465508/202008/465508-20200831185031292-12849527