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

龍城飛將軍發表於2020-08-31

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

核心流程:

  1. 迴圈資原始檔,使用com.bstek.urule.builder.resource.Resource介面實現
  2. 如果規則是UL(規則文字檔案),直接載入。
  3. 其他均為xml定義,使用ResourceProvider載入檔案或資料庫中的xml檔案
  4. 迴圈呼叫resourceBuilders,解析xml到各類規則檔案中
  5. 構建Rete樹

ResourceBuilder

解析規則,從xml中解析為規則模型,介面有10個實現,分別對應頁面可新增的10中規則、庫檔案。

RuleSetResourceBuilder 為例解析解析過程

ResouceBuilder通過Deserializer介面對parse介面完成適配。

Parser

Parse介面負責xml解析,接受dom4j輸入,解析為規則或庫檔案例項

解析過程,就是一個遞迴規程,根據xml檔案的標記屬性名稱,裝配規則物件例項。實現與Spring的XmlBeanFactory有相似也不同。

總結

相關文章