首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

KIE Drools 6.3 實戰教程(二):Maven 客戶端遠程調用 Stateless 規則會話全流程

     編輯:Java 綜合教學

項目結構與 Maven 依賴


<properties>
    <drools.version>6.3.0.Final</drools.version>
</properties>

<repositories>
    <repository>
        <id>guvnor-m2-repo</id>
        <url>https://192.168.0.101:8080/kie-drools/maven2/</url>
    </repository>
</repositories>

<dependencies>
    <dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency>
    <dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency>
    <dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency>
    <dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${drools.version}</version></dependency>
    <dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>${drools.version}</version></dependency>
    <dependency><groupId>org.kie</groupId><artifactId>kie-ci</artifactId><version>${drools.version}</version></dependency> <!-- 關鍵:支持遠程 Maven 解析 -->
</dependencies>

本地 Fact 類與遠程包結構對齊

包結構對齊

包名必須與 Kie Workbench 專案 `package` 完全一致(如 `org.sky.drools.approvaldecision`),Fact 類字段、Getter/Setter 需與遠程 Data Object 定義一致,否則反序列化失敗。

Stateless 遠程調用核心客戶端代碼


public class RemotePaymentRulz {
    public static void main(String[] args) throws Exception {
        // 1. 遠程 KJAR 地址
        String url = "https://192.168.0.101:8080/kie-drools/maven2/org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar";
        
        // 2. 構建 KieServices、Repository
        KieServices ks = KieServices.Factory.get();
        KieRepository kr = ks.getRepository();
        
        // 3. 認證下載 KJAR
        UrlResource urlResource = (UrlResource) ks.getResources().newUrlResource(url);
        urlResource.setUsername("tomcat");
        urlResource.setPassword("tomcat");
        urlResource.setBasicAuthentication("enabled");
        InputStream is = urlResource.getInputStream();
        
        // 4. 註冊模塊到本地 Repository
        KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));
        
        // 5. 創建容器
        KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
        
        // 6. 獲取 Stateless 會話(kmodule.xml 中定義的 session 名)
        StatelessKieSession kSession = kContainer.newStatelessKieSession("defaultStatelessKieSession");
        
        // 7. 構建 Fact、執行規則
        PaymentInfo payment = new PaymentInfo();
        payment.setMoneyAmount(5001); // 觸發 "GM" 規則
        kSession.execute(payment); // 一次性執行,自動 fireAllRules + dispose
        
        // 8. 讀取規則修改後的結果
        System.out.println("決策路徑: " + payment.getDecisionPath());
        if ("M".equalsIgnoreCase(payment.getDecisionPath())) {
            System.out.println("金額 ≤ 5000,經理審批");
        } else {
            System.out.println("金額 > 5000,總經理審批");
        }
    }
}

關鍵 API 流程解析

  1. UrlResource + Basic Auth → 安全下載遠程 KJAR
  2. KieRepository.addKieModule(InputStreamResource) → 將 KJAR 註冊到本地 Maven 存儲,解析 `kmodule.xml`、`pom.properties`
  3. KieContainer → 運行時容器,持有 `KieBase`(規則網絡)、`KieSession` 工廠
  4. StatelessKieSession.execute(Object... facts) → 內部封裝:`insert(facts) → fireAllRules() → dispose()`,無狀態、線程安全、適合高併發
  5. 規則中 `modify($p) { setDecisionPath("GM") }` 觸發 Fact 字段更新,客戶端直接讀取變更後對象

Kie Workbench 端:規則熱更新驗證流程

  1. 在線修改規則:Workbench 修改閾值(如 5000 → 8000)規則修改
  2. 在線測試場景:Scenario Simulation 驗證新規則邏輯場景測試
  3. 業務審核確認:導出測試報告供業務簽署
  4. Build & Deploy:生成新版本 KJAR 到 Maven 倉庫Build部署
  5. 客戶端零代碼變更、無需重啟:下次調用自動拉取最新 KJAR(依賴 `kie-ci` 掃描間隔或手動清理本地緩存)客戶端驗證

業務敏捷響應核心價值

業務場景

  • 傳統模式:需求變更 → 代碼修改 → 編譯打包 → 測試 → 發布 → 重啟(天級/周級)
  • BRMS 模式:業務自助修改規則 → 熱部署 → 即時生效(分鐘級)
  • 關鍵能力:規則外部化、版本化、可視化、可測試、熱加載

常見問題排查

現象原因解決
ClassNotFoundException: Fact 類本地包名/類名與遠程不一致從 Workbench 導出 Data Object JAR 或手動對齊
401 UnauthorizedKie Workbench 認證失敗檢查 tomcat-users.xml 役割 `kie-server,rest-all,admin`
規則不生效kmodule.xml session 名稱錯誤 / 規則文件未包含在 kmodule核對 `kmodule.xml` <kbase> <ksession name="..."/>
內存洩漏Stateful Session 未 dispose / KieContainer 未釋放Stateless 無此問題;Stateful 必須 try-finally dispose
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved