【java規則引擎】一個基於drools規則引擎實現的數學計算例子
Love Lenka發表於2017-02-17
最近在研究JBPM工作流引擎,發現JBPM是基於Drools的,官方文件檢視得知Drools是一款規則引擎。興趣之下,仔細瞭解了下 Drools,Drools作為JBoss出品的一款開源推理和規則引擎,被廣泛的應用在各個領域,如JBPM也是基於Drools的。一般我們使用規則 引擎的前提和場景是:業務規則頻繁變化!如果業務規則穩定則無需應用規則引擎的,實際中諸如行動通訊商、銀行等領域則廣泛的使用了規則引擎,主要是為了適 應頻繁變更的規則,但又不需要影響業務邏輯程式碼。
在看了官方的一些文件介紹後,通過一個例子體驗了下Drools,例子說明如下:
1、小明手上有50元錢;
2、1元錢可以買一瓶飲料;
3、2個空瓶可以兌換一瓶飲料;
4、問題是:最終小明可以喝多少瓶飲料;
通過Drools的規則推理引擎可以很好的解決這類問題,至於搭建Drools的開發環境就不細說了。直接上程式碼說明:
一、規則fact
1 package com.nonbankcard.drools.jisuan; 2 /** 3 * 事實 4 * @author sxf 5 * 6 */ 7 public class User { 8 private int money; // 手中的錢 9 private int kp; // 空瓶數 10 private int totals; // 喝掉的瓶數 11 public int getMoney() { 12 return money; 13 } 14 public void setMoney(int money) { 15 this.money = money; 16 } 17 public int getKp() { 18 return kp; 19 } 20 public void setKp(int kp) { 21 this.kp = kp; 22 } 23 public int getTotals() { 24 return totals; 25 } 26 public void setTotals(int totals) { 27 this.totals = totals; 28 } 29 30 31 }
二、測試規則的程式碼
1 package com.nonbankcard.drools.jisuan; 2 3 import java.util.Iterator; 4 5 import org.drools.KnowledgeBase; 6 import org.drools.KnowledgeBaseFactory; 7 import org.drools.builder.KnowledgeBuilder; 8 import org.drools.builder.KnowledgeBuilderError; 9 import org.drools.builder.KnowledgeBuilderFactory; 10 import org.drools.builder.ResourceType; 11 import org.drools.io.ResourceFactory; 12 import org.drools.runtime.StatefulKnowledgeSession; 13 /** 14 * 測試規則的程式碼 15 * @author sxf 16 * 17 */ 18 public class DroolsTester { 19 20 public static void main(String[] args) throws Exception { 21 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 22 kbuilder.add(ResourceFactory.newClassPathResource("user.drl"), ResourceType.DRL); 23 if (kbuilder.hasErrors()) { 24 System.out.println("規則錯誤:"); 25 Iterator<KnowledgeBuilderError> it = kbuilder.getErrors().iterator(); 26 while (it.hasNext()) System.out.println(it.next()); 27 return; 28 } 29 KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); 30 kb.addKnowledgePackages(kbuilder.getKnowledgePackages()); 31 StatefulKnowledgeSession s = kb.newStatefulKnowledgeSession(); 32 User user=new User(); 33 user.setMoney(50); 34 s.insert(user); 35 s.fireAllRules(); 36 s.dispose(); 37 } 38 39 }
三、規則檔案
1 package cc.mzone 2 3 //list any import classes here. 4 import com.nonbankcard.drools.jisuan.User; 5 6 7 //declare any global variables here 8 9 10 11 // 規則1,如果有錢就買一瓶喝掉 12 rule "r001" 13 salience 3 14 when 15 $u:User(money>0); 16 then 17 System.out.println("餘錢:" + $u.getMoney() + ",花1元購買1瓶並喝掉"); 18 $u.setKp($u.getKp() + 1); 19 $u.setMoney($u.getMoney() - 1); 20 $u.setTotals($u.getTotals() + 1); 21 update($u); 22 end 23 24 // 規則2,如果空瓶數大於2則換購1瓶(兌換成1元錢) 25 rule "r002" 26 salience 2 27 when 28 $u:User(kp>=2); 29 then 30 System.out.println("空瓶數:" + $u.getKp() + ",兌換2個空瓶為1元錢"); 31 $u.setKp($u.getKp() - 2); 32 $u.setMoney($u.getMoney() + 1); 33 update($u); 34 end 35 36 // 規則3,列印已經喝掉的數量 37 rule "r003" 38 salience 1 39 when 40 $u:User(); 41 then 42 System.out.println("總喝掉瓶數:" + $u.getTotals()); 43 end
四:測試結果輸出
1 餘錢:50,花1元購買1瓶並喝掉 2 餘錢:49,花1元購買1瓶並喝掉 3 餘錢:48,花1元購買1瓶並喝掉 4 餘錢:47,花1元購買1瓶並喝掉 5 餘錢:46,花1元購買1瓶並喝掉 6 餘錢:45,花1元購買1瓶並喝掉 7 餘錢:44,花1元購買1瓶並喝掉 8 餘錢:43,花1元購買1瓶並喝掉 9 餘錢:42,花1元購買1瓶並喝掉 10 餘錢:41,花1元購買1瓶並喝掉 11 餘錢:40,花1元購買1瓶並喝掉 12 餘錢:39,花1元購買1瓶並喝掉 13 餘錢:38,花1元購買1瓶並喝掉 14 餘錢:37,花1元購買1瓶並喝掉 15 餘錢:36,花1元購買1瓶並喝掉 16 餘錢:35,花1元購買1瓶並喝掉 17 餘錢:34,花1元購買1瓶並喝掉 18 餘錢:33,花1元購買1瓶並喝掉 19 餘錢:32,花1元購買1瓶並喝掉 20 餘錢:31,花1元購買1瓶並喝掉 21 餘錢:30,花1元購買1瓶並喝掉 22 餘錢:29,花1元購買1瓶並喝掉 23 餘錢:28,花1元購買1瓶並喝掉 24 餘錢:27,花1元購買1瓶並喝掉 25 餘錢:26,花1元購買1瓶並喝掉 26 餘錢:25,花1元購買1瓶並喝掉 27 餘錢:24,花1元購買1瓶並喝掉 28 餘錢:23,花1元購買1瓶並喝掉 29 餘錢:22,花1元購買1瓶並喝掉 30 餘錢:21,花1元購買1瓶並喝掉 31 餘錢:20,花1元購買1瓶並喝掉 32 餘錢:19,花1元購買1瓶並喝掉 33 餘錢:18,花1元購買1瓶並喝掉 34 餘錢:17,花1元購買1瓶並喝掉 35 餘錢:16,花1元購買1瓶並喝掉 36 餘錢:15,花1元購買1瓶並喝掉 37 餘錢:14,花1元購買1瓶並喝掉 38 餘錢:13,花1元購買1瓶並喝掉 39 餘錢:12,花1元購買1瓶並喝掉 40 餘錢:11,花1元購買1瓶並喝掉 41 餘錢:10,花1元購買1瓶並喝掉 42 餘錢:9,花1元購買1瓶並喝掉 43 餘錢:8,花1元購買1瓶並喝掉 44 餘錢:7,花1元購買1瓶並喝掉 45 餘錢:6,花1元購買1瓶並喝掉 46 餘錢:5,花1元購買1瓶並喝掉 47 餘錢:4,花1元購買1瓶並喝掉 48 餘錢:3,花1元購買1瓶並喝掉 49 餘錢:2,花1元購買1瓶並喝掉 50 餘錢:1,花1元購買1瓶並喝掉 51 空瓶數:50,兌換2個空瓶為1元錢 52 餘錢:1,花1元購買1瓶並喝掉 53 空瓶數:49,兌換2個空瓶為1元錢 54 餘錢:1,花1元購買1瓶並喝掉 55 空瓶數:48,兌換2個空瓶為1元錢 56 餘錢:1,花1元購買1瓶並喝掉 57 空瓶數:47,兌換2個空瓶為1元錢 58 餘錢:1,花1元購買1瓶並喝掉 59 空瓶數:46,兌換2個空瓶為1元錢 60 餘錢:1,花1元購買1瓶並喝掉 61 空瓶數:45,兌換2個空瓶為1元錢 62 餘錢:1,花1元購買1瓶並喝掉 63 空瓶數:44,兌換2個空瓶為1元錢 64 餘錢:1,花1元購買1瓶並喝掉 65 空瓶數:43,兌換2個空瓶為1元錢 66 餘錢:1,花1元購買1瓶並喝掉 67 空瓶數:42,兌換2個空瓶為1元錢 68 餘錢:1,花1元購買1瓶並喝掉 69 空瓶數:41,兌換2個空瓶為1元錢 70 餘錢:1,花1元購買1瓶並喝掉 71 空瓶數:40,兌換2個空瓶為1元錢 72 餘錢:1,花1元購買1瓶並喝掉 73 空瓶數:39,兌換2個空瓶為1元錢 74 餘錢:1,花1元購買1瓶並喝掉 75 空瓶數:38,兌換2個空瓶為1元錢 76 餘錢:1,花1元購買1瓶並喝掉 77 空瓶數:37,兌換2個空瓶為1元錢 78 餘錢:1,花1元購買1瓶並喝掉 79 空瓶數:36,兌換2個空瓶為1元錢 80 餘錢:1,花1元購買1瓶並喝掉 81 空瓶數:35,兌換2個空瓶為1元錢 82 餘錢:1,花1元購買1瓶並喝掉 83 空瓶數:34,兌換2個空瓶為1元錢 84 餘錢:1,花1元購買1瓶並喝掉 85 空瓶數:33,兌換2個空瓶為1元錢 86 餘錢:1,花1元購買1瓶並喝掉 87 空瓶數:32,兌換2個空瓶為1元錢 88 餘錢:1,花1元購買1瓶並喝掉 89 空瓶數:31,兌換2個空瓶為1元錢 90 餘錢:1,花1元購買1瓶並喝掉 91 空瓶數:30,兌換2個空瓶為1元錢 92 餘錢:1,花1元購買1瓶並喝掉 93 空瓶數:29,兌換2個空瓶為1元錢 94 餘錢:1,花1元購買1瓶並喝掉 95 空瓶數:28,兌換2個空瓶為1元錢 96 餘錢:1,花1元購買1瓶並喝掉 97 空瓶數:27,兌換2個空瓶為1元錢 98 餘錢:1,花1元購買1瓶並喝掉 99 空瓶數:26,兌換2個空瓶為1元錢 100 餘錢:1,花1元購買1瓶並喝掉 101 空瓶數:25,兌換2個空瓶為1元錢 102 餘錢:1,花1元購買1瓶並喝掉 103 空瓶數:24,兌換2個空瓶為1元錢 104 餘錢:1,花1元購買1瓶並喝掉 105 空瓶數:23,兌換2個空瓶為1元錢 106 餘錢:1,花1元購買1瓶並喝掉 107 空瓶數:22,兌換2個空瓶為1元錢 108 餘錢:1,花1元購買1瓶並喝掉 109 空瓶數:21,兌換2個空瓶為1元錢 110 餘錢:1,花1元購買1瓶並喝掉 111 空瓶數:20,兌換2個空瓶為1元錢 112 餘錢:1,花1元購買1瓶並喝掉 113 空瓶數:19,兌換2個空瓶為1元錢 114 餘錢:1,花1元購買1瓶並喝掉 115 空瓶數:18,兌換2個空瓶為1元錢 116 餘錢:1,花1元購買1瓶並喝掉 117 空瓶數:17,兌換2個空瓶為1元錢 118 餘錢:1,花1元購買1瓶並喝掉 119 空瓶數:16,兌換2個空瓶為1元錢 120 餘錢:1,花1元購買1瓶並喝掉 121 空瓶數:15,兌換2個空瓶為1元錢 122 餘錢:1,花1元購買1瓶並喝掉 123 空瓶數:14,兌換2個空瓶為1元錢 124 餘錢:1,花1元購買1瓶並喝掉 125 空瓶數:13,兌換2個空瓶為1元錢 126 餘錢:1,花1元購買1瓶並喝掉 127 空瓶數:12,兌換2個空瓶為1元錢 128 餘錢:1,花1元購買1瓶並喝掉 129 空瓶數:11,兌換2個空瓶為1元錢 130 餘錢:1,花1元購買1瓶並喝掉 131 空瓶數:10,兌換2個空瓶為1元錢 132 餘錢:1,花1元購買1瓶並喝掉 133 空瓶數:9,兌換2個空瓶為1元錢 134 餘錢:1,花1元購買1瓶並喝掉 135 空瓶數:8,兌換2個空瓶為1元錢 136 餘錢:1,花1元購買1瓶並喝掉 137 空瓶數:7,兌換2個空瓶為1元錢 138 餘錢:1,花1元購買1瓶並喝掉 139 空瓶數:6,兌換2個空瓶為1元錢 140 餘錢:1,花1元購買1瓶並喝掉 141 空瓶數:5,兌換2個空瓶為1元錢 142 餘錢:1,花1元購買1瓶並喝掉 143 空瓶數:4,兌換2個空瓶為1元錢 144 餘錢:1,花1元購買1瓶並喝掉 145 空瓶數:3,兌換2個空瓶為1元錢 146 餘錢:1,花1元購買1瓶並喝掉 147 空瓶數:2,兌換2個空瓶為1元錢 148 餘錢:1,花1元購買1瓶並喝掉 149 總喝掉瓶數:99
根據輸出資訊,符合我們的預期,確實是只要有錢就購買。如果換一種策略,只要有2個空瓶了就兌換先,那麼可以將規則1和規則2的salience屬性值對調,這樣規則2就會優先執行。
可見輸出資訊不一樣了,也非常符合我們的預期。由此可見,不同的規則分析可以導致不同的執行路徑,但最終效果都一樣,很好的推理出了我們想要的結果。通過Drools規則推理引擎還可以解決很多類似的問題。
相關文章
- Drools 規則引擎應用2022-03-11
- Drools規則引擎簡介2022-03-18
- Drools規則引擎實踐直白總結2021-06-29
- 快速整合和使用 drools 規則引擎2024-04-09
- Drools 業務規則引擎的完整教程2022-11-10
- 25個有關Drools規則引擎的面試題2022-03-18面試題
- 基於Groovy的規則指令碼引擎實戰2018-09-21指令碼
- Java各種規則引擎2019-01-09Java
- Java規則引擎 Easy Rules2020-06-11Java
- URule規則引擎2023-03-14
- 如何學習Java的規則引擎模式? - plagov2022-02-11Java模式Go
- 如何用Go快速實現規則引擎2023-02-19Go
- 基於 XAF Blazor 的規則引擎編輯器2024-03-12Blazor
- microsoft/RulesEngine:基於 Json的C#規則引擎2022-02-10ROSJSONC#
- 一個規則引擎的視覺化方案2021-04-17視覺化
- 規則引擎模式 - upperdine2022-02-25模式
- .NET RulesEngine(規則引擎)2021-04-29
- 第2-4-4章 規則引擎Drools規則屬性-業務規則管理系統-元件化-中臺2022-11-25元件化
- 基於 XAF Blazor 的規則引擎編輯器 - 實戰篇2024-03-15Blazor
- 基於Flink和規則引擎的實時風控解決方案2019-10-23
- 符號推理:Drools規則引擎 + LangChain4j大模型演示2024-06-08符號LangChain大模型
- 架構 規則引擎 quartz2019-02-27架構quartz
- 用 Java 構建簡單的規則引擎2024-06-03Java
- 風控規則引擎(一):Java 動態指令碼2024-03-14Java指令碼
- uwegeercken/jare:Java業務規則引擎(Jare)2019-08-29JARJava
- 數字化轉型中的規則引擎2022-02-11
- hyperjumptech/grule-rule-engine: Golang的規則引擎實現2022-02-16Golang
- Spring Boot中實現規則引擎原始碼教程2024-06-03Spring Boot原始碼
- TDengine3.0 流式計算引擎語法規則介紹2022-09-30
- 在Java中用規則引擎模式替代ifelse - Vitali2021-12-06Java模式
- 什麼是規則引擎? - martinfowler2022-02-10
- Evrete 規則引擎簡介 | baeldung2021-10-21VR
- 規則引擎Golang指南 – Mohit Khare2022-09-15Golang
- 決策表模式: 一種業務規則引擎實現方式2022-02-17模式
- drools執行String規則或執行某個規則檔案2022-06-02
- 第2-4-2章 規則引擎Drools入門案例-業務規則管理系統-元件化-中臺2022-11-23元件化
- 第2-4-6章 springboot整合規則引擎Drools-業務規則管理系統-元件化-中臺2022-11-27Spring Boot元件化
- drools執行指定的規則2022-06-01
- drools執行完某個規則後終止別的規則執行2022-05-26