【java规则引擎】一个基于drools规则引擎实现的数学计算例子

最近在研究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 }
View Code

二、测试规则的代码

 

 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 }
View Code

 

三、规则文件

 

 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 
View Code

 

四:测试结果输出

  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
View Code

根据输出信息,符合我们的预期,确实是只要有钱就购买。如果换一种策略,只要有2个空瓶了就兑换先,那么可以将规则1和规则2的salience属性值对调,这样规则2就会优先执行。

可见输出信息不一样了,也非常符合我们的预期。由此可见,不同的规则分析可以导致不同的执行路径,但最终效果都一样,很好的推理出了我们想要的结果。通过Drools规则推理引擎还可以解决很多类似的问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Welcome to Drools ================= Third party jars ---------------- Following third party jars are optional and are not included in Drools distribution: 1.Quartz: Quartz is an optional jar only needed if you wish to adapt existing quartz calendars. It can be downloaded from http://www.quartz-scheduler.org/. Run the examples ---------------- It's easy to run the examples: On Linux, Mac or Cygwin: examples/runExamples.sh On Windows: examples\runExamples.bat Run the examples in Eclipse --------------------------- Open Eclipse, install the Drools plugin, as described in the introduction reference manual. Open menu Window, menu item Preferences, tree item Drools, tree item Installed Drools Runtime environments Add the dir "binaries/" from the zip as a new Drools Runtime Environment. Activate the checkbox of that newly created runtime environment. Restart eclipse. Open menu File, menu item Import..., tree item General, tree item Existing Projects into Workspace, button Next and select root directory "examples/sources/" from the zip, button Finish. Alternatively, if you have the m2eclipse plugin installed: Open menu File, menu item Import, tree item Maven, tree item Existing Maven Projects, button Next and select "examples/sources/" from the zip, button Finish. Open menu Run, menu item Run configurations, add new Java Application with main class "org.drools.examples.DroolsExamplesApp" and VM arguments "-Xms256m -Xmx512m -server", click button Run. Run the examples in IntelliJ ---------------------------- Open menu File, menu item Open project, select "examples/sources/pom.xml". Open menu Run, menu item Edit Configurations, add a new Application with main class "org.drools.examples.DroolsExamplesApp" and VM parameters "-Xms256m -Xmx512m -server" and run that. Read the reference manual ------------------------- To see the reference_manual, just open: reference_manual/html_single/index.html It contains information how to use it on your project (wi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值