Urule執行規則檔案,是如何進行的,通過一個請求doTest來探一下
com.bstek.urule.console.servlet.respackage.PackageServletHandler.doTest()方法執行測試規則,接受3個引數: data-測試資料;files- 規則檔名稱及版本;flowId- 規則中包含流程有效,流程id。
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. 快取。
進一步看: KnowledgeBase knowledgeBase=knowledgeBuilder.buildKnowledgeBase(resourceBase); 這一行
3 KnowledgeBuilder.buildKnowledgeBase
核心流程:
- 迴圈資原始檔,使用com.bstek.urule.builder.resource.Resource介面實現
- 如果規則是UL(規則文字檔案),直接載入。
- 其他均為xml定義,使用ResourceProvider載入檔案或資料庫中的xml檔案
- 迴圈呼叫resourceBuilders,解析xml到各類規則檔案中
- 構建Rete樹
ResourceBuilder
解析規則,從xml中解析為規則模型,介面有10個實現,分別對應頁面可新增的10中規則、庫檔案。
RuleSetResourceBuilder 為例解析解析過程
ResouceBuilder通過Deserializer介面對parse介面完成適配。
Parser
Parse介面負責xml解析,接受dom4j輸入,解析為規則或庫檔案例項
解析過程,就是一個遞迴規程,根據xml檔案的標記屬性名稱,裝配規則物件例項。實現與Spring的XmlBeanFactory有相似也不同。