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


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有相似也不同。

總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM