前言
这两天研究了一下JBoss Rules,最大的感觉是JBoss Rules的文档写得不错,而且Eclipse IDE插件的功能也挺不错,相比JBoss JBPM好多了。
个人觉得规则引擎就是把一堆if/else逻辑从业务代码转移到配置文件中,这样如果业务规则发生变化就不用更改代码,而且如果描述这种规则的语言足够清晰明白,更改业务规则的任务就可以由业务人员来完成了,Domain Specific Language就是来干这事的。
JBoss Rules的内部机制,这里就不再详细介绍了,已经有先行者对JBoss Rules的参考手册进行了整理,参见www.blogjava.net/guangnian0412/category/11762.html。
我针对一个实际的业务场景写了一个例子,应用场景是这样的,一个汽车网的销售人员的提成有一定的规则,大致的规则根据售出价格的折扣来决定提成比例,比如如果10000元的广告服务,最后售出价格是4500,销售人员的提成是0.3%。
创建工程
假定已经安装了Eclipse JBoss Rules插件,新建一个Rules工程。
创建规则文件
创建一个规则文件如下:
ruby 代码
-
- package org.gaofubing.commision
-
- import org.gaofubing.discount.CommisionComputer;
-
-
-
- rule "lessThanFive"
-
- when
- computer:CommisionComputer(discount < 5)
- then
- computer.setDeduct(0.03);
- end
-
-
- rule "equalsFive"
-
- when
- computer:CommisionComputer(discount == 5)
- then
- computer.setDeduct(0.1);
- end
-
-
- rule "betweenFiveAndSix"
-
- when
- computer: CommisionComputer(discount:discount,discount > 5,discount <= 6)
- then
- computer.setDeduct(((discount.doubleValue() -5) * 0.5 + 6 * 0.1 ) / discount.doubleValue());
- end
-
-
- rule "betweenSixAndSeven"
-
- when
- computer: CommisionComputer(discount:discount,discount > 6,discount <= 7)
- then
- computer.setDeduct(((discount.doubleValue() -6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) / discount.doubleValue());
- end
-
-
- rule "betweenSevenAndEight"
-
- when
- computer:CommisionComputer(discount:discount,discount > 7,discount <= 8)
- then
- computer.setDeduct(((discount.doubleValue() -7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) / discount.doubleValue());
- end
-
-
- rule "betweenEightAndNine"
-
- when
- computer:CommisionComputer(discount:discount,discount > 8,discount <= 9)
- then
- computer.setDeduct(((discount.doubleValue() -8) * 0.7 + (8-7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) / discount.doubleValue());
- end
-
-
- rule "greaterThanNine"
-
- when
- computer:CommisionComputer(discount:discount,discount > 9)
- then
- computer.setDeduct(((discount.doubleValue() -9) * 0.85 + (9-8) * 0.7 + (8-7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) / discount.doubleValue());
- end
在测试的时候发生过一些问题,如果要描述折扣大于8小于9的条件,使用如下代码就不行
java 代码
- computer: CommisionComputer(discount:discount,discount > 6) && CommisionComputer(discount <= 7)
另外CommisionComputer的discount属性是double类型,Rules的then部分会将其自动封箱,但是不会自动拆箱,所以如果then部分使用discount就会报错,必须使用discount.doubleValue();
创建Java类
CommisionComputer类的主要方法是computeCommision方法接受一个合同价格和售出价格,返回销售人员的提成数额。
java 代码
- package org.gaofubing.discount;
-
- import java.io.InputStreamReader;
- import java.io.Reader;
-
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.drools.RuleBase;
- import org.drools.RuleBaseFactory;
- import org.drools.WorkingMemory;
- import org.drools.compiler.PackageBuilder;
- import org.drools.rule.Package;
-
- public class CommisionComputer
- {
- private static final String RULE_FILE = "discount.drl";
-
- protected static Log log = LogFactory.getLog(CommisionComputer.class);
-
-
- private double discount;
-
-
- private double deduct;
-
-
-
-
-
-
-
- public double computeCommision(double contractPrice,double saledPrice)
- {
- try {
-
- RuleBase ruleBase = readRule(RULE_FILE);
- WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
- log.debug("执行规则前的提成比例值为:" + getDeduct());
-
-
- setDiscount(saledPrice * 10d /contractPrice);
- workingMemory.assertObject(this);
- workingMemory.fireAllRules();
-
- log.debug("执行规则后的提成比例值为:" + getDeduct());
-
- } catch (Throwable t) {
- t.printStackTrace();
- log.debug("不能成功执行规则",t);
- }
- return contractPrice * getDeduct();
- }
-
-
-
-
-
- private RuleBase readRule(String ruleFile) throws Exception
- {
-
- Reader source = new InputStreamReader(CommisionComputer.class.getClassLoader().getResourceAsStream(ruleFile));
-
-
- PackageBuilder builder = new PackageBuilder();
- builder.addPackageFromDrl( source );
- Package pkg = builder.getPackage();
-
-
- RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- ruleBase.addPackage( pkg );
- return ruleBase;
- }
-
- public double getDiscount()
- {
- return discount;
- }
-
- public void setDiscount( double discount)
- {
- this.discount = discount;
- }
-
- public double getDeduct()
- {
- return deduct;
- }
-
- public void setDeduct( double deduct)
- {
- this.deduct = deduct;
- }
-
- }
创建测试
测试代码如下:
java 代码
- public void testDiscountLessThanFive()
- {
- double commision = computer.computeCommision(10000,4500);
- assertEquals(commision,10000*0.03);
- }
-
- public void testDiscountEqualsFive()
- {
- double commision = computer.computeCommision(10000,5000);
- assertEquals(commision,10000*0.1);
- }
-
- public void testDiscountBetweenFiveAndSix()
- {
- double commision = computer.computeCommision(10000,5500);
- double discount = 5500 * 10d /10000;
- double deduct = ((discount -5) * 0.5 + 6 * 0.1 ) /discount;
- assertEquals(commision,10000*deduct);
- }
-
- public void testDiscountBetweenSixAndSeven()
- {
- double commision = computer.computeCommision(10000,6500);
- double discount = 6500 * 10d /10000;
- double deduct = ((discount -6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) /discount;
- assertEquals(commision,10000*deduct);
- }
-
- public void testDiscountBetweenSevenAndEight()
- {
- double commision = computer.computeCommision(10000,7500);
- double discount = 7500 * 10d /10000;
- double deduct = ((discount -7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) /discount;
- assertEquals(commision,10000*deduct);
- }
-
- public void testDiscountBetweenEightAndNine()
- {
- double commision = computer.computeCommision(10000,8500);
- double discount = 8500 * 10d /10000;
- double deduct = ((discount -8) * 0.7 + (8-7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) /discount;
- assertEquals(commision,10000*deduct);
- }
-
- public void testDiscountGreaterThanNine()
- {
- double commision = computer.computeCommision(10000,9500);
- double discount = 9500 * 10d /10000;
- double deduct = ((discount -9) * 0.85 + (9-8) * 0.7 + (8-7) * 0.65 + (7-6) * 0.6 + (6 - 5) * 0.5 + 5 * 0.1 ) /discount;
- assertEquals(commision,10000*deduct);
- }
分享到:
相关推荐
之前学习jboss rules 只能自己一点点的啃英文用户指南,后来终于找到了中文版的翻译版本,真是高兴,立即奉献给大家,让对规则引擎感兴趣的朋友也能一堵为快。 内容摘要:JBoss Rules 的前身是Codehaus的一个开源...
jboss rules 中文用户指南,mht文件,共十章。
jboss rules 中文学习资料.chm
JBoss Rules 的前身是Codehaus的一个开源项目叫Drools。最近被纳入JBoss门下,更名为JBoss Rules,成为了JBoss应用服务器的规则引擎。 Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有...
规则引擎的入门资料,比较全,包含word资料和pdf资料。
介绍jboss的书籍 ,蛮不错的
Drool初学者适用的实例。 注意:要安装drool IDE插件。
JBOSSRULES使用文档
高清晰版,很好的drools 5学习用书
myeclipse安装drools jboss rules规则引擎
Drools JBoss Rules 5.X 开发者指南 (英文版) Drools JBoss Rules 5.X Developer's Guide (E-Book) ☆ 出版信息:☆ [作者信息] Michal Bali [出版机构] Packt Publishing [出版日期] 2013年05月24日 [图书...
09年7月,jboss 官方网站最新推荐的jboss rules教程
Drools JBoss Rules 5.0 Developer's Guide Drools 5.0开发教程
规则引擎,drools,jboss rules
1.基于JBOSS RULES(DROOLS) 6.5 开发 2.JAR包精简后只有20个 10.9M 3.动态规则 项目中使用需自己修改为从数据库加载规则
jboss rules用户指南(中文)PDF格式
Drools Jboss Rules 5.0 Developer's Guide, This book guides you through various features of Drools, such as rules, ruleflows, decision tables, complex event processing, Drools Rete implementation with ...