| 特性 | StatelessKieSession | StatefulKieSession |
|---|---|---|
| 生命週期 | 單次 execute(facts) 即結束 | 長期持有,需手動 dispose() 釋放 |
| 事實狀態 | 執行間隔無狀態保留 | Fact 對象變更持久化於工作內存 |
| 適用場景 | 驗證、計算、一次性決策 | 長流程、多步交互、CEP 複雜事件處理 |
| 性能 | 輕量,無內存持久化開銷 | 需管理工作內存,佔用堆內存 |
String url = "https://192.168.0.101:8080/kie-drools/maven2/org/sky/drools/ApprovalDecision/1.0.0/ApprovalDecision-1.0.0.jar";
KieServices ks = KieServices.Factory.get();
KieRepository kr = ks.getRepository();
UrlResource urlResource = (UrlResource) ks.getResources().newUrlResource(url);
urlResource.setUsername("tomcat");
urlResource.setPassword("tomcat");
urlResource.setBasicAuthentication("enabled");
InputStream is = urlResource.getInputStream();
KieModule kModule = kr.addKieModule(ks.getResources().newInputStreamResource(is));
KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
// 關鍵:創建 Stateful 會話
KieSession kieSession = kContainer.newKieSession();
try {
PaymentInfo payment = new PaymentInfo();
payment.setMoneyAmount(10000);
// 插入事實,觸發規則匹配
kieSession.insert(payment);
kieSession.fireAllRules(); // 執行所有匹配規則
System.out.println("決策路徑: " + payment.getDecisionPath());
} catch (Exception e) {
e.printStackTrace();
} finally {
// 必須顯式釋放,否則工作內存洩漏、事實對象無法 GC
try { kieSession.dispose(); } catch (Exception ignored) {}
}

三大核心價值主張:

流程引擎(jBPM/Activiti/Flowable)執行至決策網關,調用 KieServer 規則服務:
// 規則文件片段
rule "報銷金額路由"
when
$p : PaymentInfo(moneyAmount > 5000)
then
modify($p) { setDecisionPath("GM") }; // 總經理審批
end
rule "小額報銷路由"
when
$p : PaymentInfo(moneyAmount <= 5000)
then
modify($p) { setDecisionPath("M") }; // 經理審批
end
BPM 根據返回的 decisionPath("M" 或 "GM")自動路由至對應人工任務節點。業務規則變更(如閾值調整為 8000)無需重新部署流程應用,仅在 Kie Workbench 熱更新規則並 Build,下一流程實例自動生效——實現「24×7 業務敏捷響應」。



