Drools?業務引擎

drools引擎使用

官網介紹
一、底層原理

  1. ReteOO 網絡
    ? 本質是一張“有向無環圖”,節點類型:
    – Root / ObjectTypeNode:按 Java 類型分發事實
    – AlphaNode:單對象約束(age > 18)
    – BetaNode(Join / Not / Exists):多對象關聯(o.customer == c)
    – TerminalNode:規則完全匹配,生成 Activation 放進 Agenda
    ? 優勢:用空間換時間,緩存中間結果,避免重復計算 。

  2. 工作內存(Working Memory)
    ? 存放所有插入的 Fact(Java Bean),內部用 Map<Class, ObjectStore> 維護。

  3. 議程(Agenda)
    ? 存放“可觸發”的 Activation;支持 salience、agenda-group、ruleflow-group 等沖突解決策略。

  4. 推理循環
    insert / update / delete → 網絡傳播 → Agenda 新增/修改 Activation → fireAllRules → 執行 RHS 。

——————————————————
二、使用方式(最簡三步)

  1. 引入 Maven
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>8.44.0.Final</version>
</dependency>
  1. 規則文件 src/main/resources/rules/order.drl
package rules
import com.demo.Orderrule "large-order-discount"
when$o : Order(amount > 100)
then$o.setDiscount(0.9);      // 打9折System.out.println("Large order discount applied");
end
  1. Java 啟動類
// 1. 創建Kie容器
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();// 2. 創建會話
KieSession kieSession = kContainer.newKieSession("ksession-rules");// 3. 插入事實
kieSession.insert(new Person("John", 25, "male"));// 4. 執行規則
kieSession.fireAllRules();// 5. 釋放資源
kieSession.dispose();

——————————————————
三、源碼級要點(8.x 分支)

  1. 入口
    ? KieServices.Factory.get()KieContainerImplKieBaseImpl 完成 drl 編譯。

  2. 規則編譯
    ? DrlParser 把規則文本 → AST → PackageDescr
    ? KnowledgeBuilderImpl 調用 ReteCompiler 構建網絡,生成 RuleImplRete 對象 。

  3. 事實插入鏈路(調試可直接打斷點)

FactHandle handle = kSession.insert(obj);-> StatefulKnowledgeSessionImpl.insert()-> ObjectStore.add()-> propagate()-> ReteOOWorkingMemory.update()-> ObjectTypeNode.assertObject()-> AlphaNode.assertObject()-> BetaNode.assertObject()-> TerminalNode.assertObject()-> Agenda.addActivation()
  1. 規則執行
    ? DefaultAgenda.fireNextItem() 取出 Activation → RuleExecutor.evaluate() → 執行 RHS 對應的 ConsequenceGenerator 生成的字節碼。

——————————————————
四、完整可運行 Demo(Spring Boot 可直接啟動)

目錄結構

src
└─ main├─ java│  └─ com.demo│      ├─ Order.java│      └─ DroolsApp.java└─ resources├─ rules/order.drl└─ META-INF/kmodule.xml
  1. Order.java
@Data
public class Order {private int amount;private double discount = 1.0;public double getFinalAmount() {return amount * discount;}
}
  1. kmodule.xml
<kmodule xmlns="http://www.drools.org/xsd/kmodule"><kbase name="rules" packages="rules"><ksession name="ksession-rules"/></kbase>
</kmodule>
  1. DroolsApp.java
@SpringBootApplication
public class DroolsApp implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(DroolsApp.class, args);}@Overridepublic void run(String... args) {KieServices ks = KieServices.Factory.get();KieContainer kc = ks.getKieClasspathContainer();KieSession kSession = kc.newKieSession("ksession-rules");Order order = new Order();order.setAmount(150);kSession.insert(order);kSession.fireAllRules();kSession.dispose();System.out.println("amount=" + order.getAmount()+ ", discount=" + order.getDiscount()+ ", finalAmount=" + order.getFinalAmount());}
}

運行結果

Large order discount applied
amount=150, discount=0.9, finalAmount=135.0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89223.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux的磁盤滿了清理辦法

今天測試系統的某個磁盤滿了&#xff0c;需要看一下&#xff0c;可以看到的是&#xff0c;已經被占用百分之百了&#xff0c;某些服務運行不了了&#xff0c;需要清一下&#xff0c;這個我熟看哪個目錄占用空間大cd / du -sh * ##找到占用最大&#xff0c;比如cd /home cd /hom…

阿里開源項目 XRender:全面解析與核心工具分類介紹

阿里開源項目 XRender&#xff1a;全面解析與核心工具分類介紹 在開源技術飛速發展的浪潮中&#xff0c;阿里巴巴推出的 XRender 作為專注于表單與數據可視化的開源框架&#xff0c;憑借獨特的設計理念和強大功能&#xff0c;已在開發者群體中嶄露頭角。XRender 以 “協議驅動…

網絡安全初級--搭建

一、Docker搭建apt-get install docker.io docker-compose 下載docker 配置docker代理 a.創建對應的以及對應的文件mkdir /etc/systemd/system/docker.service.dvim /etc/systemd/system/docker.service.d/http-proxy.confb.寫入以下內容[Service]Environment"HTTP_PROXYh…

文心一言4.5深度評測:國產大模型的崛起之路

在?語?模型競爭?益激烈的今天&#xff0c;百度推出的文???4.5憑借其在中文處理上的獨特優勢&#xff0c;正在成為越來越 多開發者的選擇。經過為期?周的深度測試和數據分析&#xff0c;我將從技術參數、性能表現、成本效益等多個維度&#xff0c; 為?家呈現這款國產?模…

科技的成就(六十九)

631、攝影術的先驅 1801年&#xff0c;德國物理學家約翰威廉里特&#xff08;Johann Wilhelm Ritter&#xff09;發現了紫外線。他注意到&#xff0c;太陽光譜中紫色一側光譜之外的位置的不可見射線比紫光更快地使氯化銀試劑變暗&#xff0c;他將其稱為“化學射線”。后來這種射…

用Golang gRPC異步處理:釋放并發性能的秘密武器

目錄 章節一:為什么gRPC異步處理是并發性能的“加速器” 異步的本質:解放Goroutine的潛能 異步gRPC的適用場景 章節二:從零開始:搭建一個異步gRPC服務 準備工作:定義Protobuf 實現同步gRPC服務 邁向異步:初步改造 章節三:用Worker Pool模式榨干并發性能 Worker …

MCP終極篇!MCP Web Chat項目實戰分享

目錄 前言 MCP Web Chat 功能概要說明 MCP Web Chat代碼調用結構說明 api動態生成MCP Server 方法一&#xff08;之前的方法&#xff09; 方法二&#xff08;現在的方法&#xff09; 做個比較 相關代碼 相關問題解決說明 穩定性 由此引申而來的異步任務問題 MCP周…

破解VMware遷移難題

理解VMware遷移的常見挑戰 VMware遷移過程中可能遇到的難題包括兼容性問題、性能瓶頸、數據完整性風險以及網絡配置復雜性。識別這些問題是制定有效遷移策略的基礎。 評估當前環境與目標環境 詳細分析源VMware環境的配置、虛擬機數量、存儲類型和網絡拓撲。對比目標環境的硬件和…

15-STM32F103RCT6的FLASH寫入

STM32F103RCT6的FLASH寫入 1.//*******************************固件升級地址信息******************************// #define STM32_FLASH_BASE 0x08000000 //固件起始地址 #define FLASH_APP_ADDR 0x08005000 //APP開始地址 #define FLASH_PARA_ADDR 0x0803C000 //固件關…

PPO:近端策略優化算法

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" PPO&#xff1a;近端策略優化算法 摘要 我們提出了一類新的用于強化學習的 policy gradient 方法&#xff0c;該方法在與環境交互以采樣數據和使用隨機梯度上升優化一個“代理”目標函數之間交替進行。與標準的…

數據結構的算法分析與線性表<1>

一、算法分析&#xff1a; 由于語句執行一次的實際所需時間與機器的軟硬件有關&#xff0c;則算法分析是針對語句執行次數&#xff0c;而非執行時間。 時間復雜度 計算時間復雜度&#xff1a; 常量階 如果算法中的n是固定的&#xff0c;或者說n是常數&#xff0c;或者時間復雜…

esp32使用ESP-IDF在Linux下的升級步驟,和遇到的坑Traceback (most recent call last):,及解決

因為之前使用的是ESP-IDF5.3版本。而5.3版本又不支持ESP32P4。而V5.4版本開始正式對P4的支持。所以我把ESP-IDF 升級到V5.4.2的release版本。 一、升級版本&#xff1a;【根據樂鑫官方的方式升級】ESP-IDF 版本簡介 - ESP32-P4 - — ESP-IDF 編程指南 v5.4.2 文檔 更新至一個穩…

【算法】貪心算法:最大數C++

文章目錄前言題目解析算法原理字典序代碼示例策略證明前言 題目的鏈接&#xff0c;大家可以先試著去做一下再來看一下思路。179. 最大數 - 力扣&#xff08;LeetCode&#xff09; 題目解析 還是老樣子&#xff0c;把題目讀懂&#xff0c;畫出有用信息。 認真看示例&#xff0…

網絡安全職業指南:探索網絡安全領域的各種角色

本文旨在為對網絡安全領域感興趣的粉絲讀者提供一份全面的職業指南。我們將探討網絡安全領域中各種不同的職業角色&#xff0c;包括其職責、所需技能以及職業發展路徑&#xff0c;幫助你了解網絡安全領域的職業選擇&#xff0c;并為你的職業規劃提供參考。網絡安全職業概覽 身處…

Design Vision:顯示扇入/扇出邏輯

相關閱讀 Design Visionhttps://blog.csdn.net/weixin_45791458/category_13006970.html?spm1001.2014.3001.5482 在使用Design Vision中查看示意圖時&#xff0c;可以在示意圖中查看所選單元(Cell)、引腳(Pin)、端口(Port)或線網(Net)的扇入/扇出邏輯。用戶可以在當前激活的…

13.7 Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析

Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析 指令微調模型:LLaMA2-Chat 技術深度解析 LLaMA2-Chat 作為 Meta 推出的對話優化大模型,其技術實現展現了大模型對齊(Alignment)領域的前沿突破。與基礎版 LLaMA2 相比,該…

二維仿射變換筆記

二維仿射變換筆記 1. 數學基礎 1.1 變換矩陣 二維仿射變換使用3x3的齊次坐標矩陣表示: [a b tx] [c d ty] [0 0 1 ]其中: [a b; c d] 是線性變換部分,表示旋轉、縮放和錯切[tx; ty] 是平移部分最后一行 [0 0 1] 是齊次坐標的固定形式1.2 基本變換 1.2.1 平移變換 將點…

創建自定義Dataset類與多分類問題實戰

codes 文章目錄&#x1f31f; 6 多分類問題與卷積模型的優化&#x1f9e9; 6.1 創建自定義Dataset類?? 數據集特點&#xff1a;&#x1f511; 關鍵實現步驟&#xff1a;&#x1f6e0;? 自定義Dataset類實現&#x1f4ca; 數據集劃分與可視化&#x1f9e0; 6.2 基礎卷積模型&…

用vue自定義指令設置頁面權限

1.按鈕權限處理/*** v-hasPermi 按鈕權限處理*/import store from /storeexport default {inserted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions store.getters && store.getters.permissionsif (value…

JPA / Hibernate

1. JPA 和 Hibernate 有什么區別&#xff1f;JPA 是 Java 官方提出的一套 ORM 規范&#xff0c;它只定義了實體映射、關系管理、查詢接口等標準&#xff0c;不包含具體實現。Hibernate 是對 JPA 規范的最常用實現&#xff0c;提供了完整的 ORM 功能&#xff0c;并擴展了許多 JP…