Drools规则引擎开发说明
[Drools]JAVA规则引擎(非常好的一篇教程)
![[Drools]JAVA规则引擎(非常好的一篇教程)](https://img.taocdn.com/s3/m/58d650317375a417866f8ff8.png)
[Drools]JA V A规则引擎(非常好的一篇教程)Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。
本文所使用的demo已上传/source/30022131、Drools语法开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。
在drools中,这个传递数据进去的对象,术语叫Fact对象。
Fact 对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean 插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。
规则文件可以使用.drl文件,也可以是xml文件,这里我们使用drl文件。
规则语法:package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。
特别的是,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分。
同样的package下定义的function和query等可以直接使用。
比如:package com.drools.demo.pointimport:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
Drools规则引擎介绍

TEAM BSTEK
Drools实现的用户信息合法性检查规则
▪ /** ▪ 如果申请人既没房也没车,同时学历为大专及以下,并且月薪少于5000,那么不通过。 ▪ */ ▪ rule "检查学历与薪水1" ▪ ruleflow-group "applycheck" ▪ lock-on-active true ▪ salience 1 ▪ when ▪ Current user ▪ -degree is 1 ▪ -has car is false ▪ -has house is false ▪ -salary is less then 5000 ▪ then ▪ So current user apply is invalid ▪ end
▪ 最新版本Drools5提供了基于WEB的BRMS——Guvnor,Guvnor提供了规则管理的知识库,通过它可以 实现规则的版本控制,及规则的在线修改与编译,使得开发人员和系统管理人员可以在线管理业务规则。
▪ Eclipse Plugin版规则设计器
4
▪ Drools的Guvnor
© Copyright BSTEK Corporation 2006
5
© Copyright BSTEK Corporation 2006
TEAM BSTEK
用户需要输入的个人信息
▪ 用户需要输入的信息包括:姓名、性别、年龄、学历、电话、所在公司、职位、月收入、 是否有房、是否有车、是否有信用卡等。
点击“申请”按钮将申请信息提交到后台,后台启动审批流程,通过规则先对信息的合法性进 行验证,对于验证合格申请系统将调用相关规则发放相关的信用卡。
如果申请人没房没车,月收入在10000以下,那么发放的信用额 度为3000。
drools规则引擎

Drools引擎一、drools是什么Drools是为Java量身定制的基于RETE算法的规则引擎的实现。
具有了OO(面向对象)接口的RETE,使得商业规则有了更自然的表达。
Rule是什么呢?一条规则是对商业知识的编码。
一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS )。
Drools 允许下列几种:attributes:salience,agenda-group,no-loop,auto-focus,duration,activation-group。
1.salience功能:设置规制执行的优先级值:数字(数字越大执行优先级越高)示例:rule "rule1"salience 1wheneval(true)thenSystem.out.println("rule1");end2.no-loop功能:控制已经执行的规则条件再次满足是否再次执行值:true/false示例:rule "rule1"no-loop truewhen$customer:Customer(name=="张三")thenupdate($customer);System.out.println("customer name:"+$customer.getName());End3.activation-group功能:若干个规则划分成一个组值:分组名称示例:rule "rule2"activation-group "test"salience 10wheneval(true)thenSystem.out.println("rule2 execute");endrule "rule1"activation-group "test"salience 9wheneval(true)thenSystem.out.println("rule1 execute");endnote:如果同一组规则,谁的salience高就执行谁,没有则按顺序执行最后同组最后那个规则4.date-expires功能:当系统时间<=date-expires后才会触发值:日期默认格式为dd-MMM-yyyy可以设置其它时间格式如yyyy-MM-dd,需在代码设置系统时间格式System.setProperty("drools.dateformat", "yyyy-MM-dd");示例:rule "rule1"date-expires "2009-09-27"wheneval(true);thenSystem.out.println("rule1 is execution!");end5、duration:规则定时,duration 3000 3秒后执行规则6、agenda-group:规则的调用与执行是通过Stateless KieSession或KieSession来实现的,一般的顺序是创建一个Stateless KieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAll Rules 方法来触发、执行规则。
规则引擎-drools使用讲解(简单版)-Java

规则引擎-drools使⽤讲解(简单版)-Javadrools规则引擎现状:1. 运维同学(各种同学)通过后台管理界⾯直接配置相关规则,这⾥是通过输⼊框、下拉框等完成输⼊的,⾮常简单;2. 规则配置完毕后,前端请求后端,此时服务端根据参数(即规则)⽣成drl规则⽂件;3. ⽤户侧有相关请求到达时,服务端加载规则⽂件(可能是多个,⼀般⼀个⼴告、活动对应⼀个规则⽂件),并通过引擎去检查当前⽤户各种状态是否满⾜规则⽂件;4. 将所有满⾜的规则⽂件对应的⼴告、活动进⾏下发,同时更新⽤户数据;5. 完成整个drools相关流程;关于drools是⼀款标准、效率⾼、速度快的开源规则引擎,基于ReteOO算法,⽬前主要应⽤场景在⼴告、活动下发等领域⾮常多,⽐如APP的活动下发,通常都是有很多条件限制的,且各种活动层出不穷,⽆法代码穷举,⽽如果每次为了⼀个活动重新发版上线,显然是不合理的,因此通过drools将活动中变的部分抽象为⼀个个单独的规则⽂件,来屏蔽这部分的变化,使得系统不需要从代码层⾯做出改变,当然了为了更加极致的抽象,通常还需要对规则中的⼀些可配条件(⼤于、⼩于、等于、范围、次数等)也提取到数据库中,这样在现有规则不满⾜要求时,可以直接通过更改数据库的对应规则表来完善,同样不需要改代码;我们当时的需求主要就是⼴告、活动下发规则⽐较多,⼴告也是各式各样,因此去调研了drools,对drools也没有过多的挖掘其更多特性,因此还需要⼤家的指点;drools简单使⽤服务端项⽬中使⽤drools的⼏个基本步骤;step 1 -- 添加相关依赖到maven pom.xml<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>6.4.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.4.0.Final</version></dependency>step 2 -- 创建实体类加载规则⽂件public class CarIllegalRules extends BaseRules{public static void main(String[] args) {try {KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession ksession = kContainer.newKieSession("ksession-rules");CarIllegalRules carIllegalRules = new CarIllegalRules(10,500,10);ksession.insert(carIllegalRules);ksession.fireAllRules();System.out.println(carIllegalRules.isCan_push()+","+carIllegalRules.getContent());} catch (Exception e) {e.printStackTrace();}}private int illegal_count;private int illegal_money;private int illegal_points;public CarIllegalRules(int illegal_count, int illegal_money, int illegal_points) {super();this.illegal_count = illegal_count;this.illegal_money = illegal_money;this.illegal_points = illegal_points;this.param_value = "illegal_count,illegal_money,illegal_points";}@Overridepublic String toString() {return "CarIllegalRules [illegal_count=" + illegal_count + ", illegal_money=" + illegal_money+ ", illegal_points=" + illegal_points + ", can_push=" + can_push + ", content=" + content + ", tts="+ tts + "]";}public int getIllegal_count() {return illegal_count;}public void setIllegal_count(int illegal_count) {this.illegal_count = illegal_count;}public int getIllegal_money() {return illegal_money;}public void setIllegal_money(int illegal_money) {this.illegal_money = illegal_money;}public int getIllegal_points() {return illegal_points;}public void setIllegal_points(int illegal_points) {this.illegal_points = illegal_points;}}PS:main函数是⽤来测试这个类的;step 3 -- 创建DSLUtils类去执⾏相应规则public class DSLUtil {public static void fireRules(File file, Object rules) {try {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();Resource resource = kieServices.getResources().newFileSystemResource(file);fire(rules, kieServices, kfs, resource);} catch (Exception e) {e.printStackTrace();}}public static void fireRules(String urlStr, Object rules) {try {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();Resource resource = kieServices.getResources().newFileSystemResource(FileUtil.getFileFromUrl(urlStr));fire(rules, kieServices, kfs, resource);} catch (Exception e) {e.printStackTrace();}}private static void fire(Object commonRules, KieServices kieServices, KieFileSystem kfs, Resource resource)throws Exception {resource.setResourceType(ResourceType.DRL);kfs.write(resource);KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {throw new Exception();}KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());KieBase kBase = kieContainer.getKieBase();KieSession ksession = kBase.newKieSession();ksession.insert(commonRules);ksession.fireAllRules();}}step 4 -- 创建⼀个类去⽣成规则⽂件⽐如⽣成 music.drl 的⾳乐规则⽂件,这⼀步是可选的,区别在于规则⽂件的⽣成是代码⽣成,还是⼈⼯⽣成,我们的项⽬中是运维同学在后台管理界⾯通过⼀些图形化输⼊框输⼊⼀些指定参数,⽽⽣成规则⽂件是服务端代码⽣成的,因此有了这部分,⽐较实⽤,⼀⽅⾯可以降低⽣成规则⽂件的门槛,任何⼈都可以做,另⼀⽅⾯也避免了⼈⼯出错的可能;public class ActivityUtil {/*** rule template string*/private static String template ="package com.aispeech.dsl\r\n\r\n" +"import {entity_package_path};\r\n\r\n" +"import {entity_package_path}.*;\r\n\r\n" +"rule \"{rule_name}\"\r\n\r\n" +"when\r\n" +"\t{instance_name}:{class_name}({rules})\r\n" +"then\r\n" +"\t{do}\r\n" +"end";private static final String AND = " && ";private static final String OR = " || ";/*** get business rule file xxx.drl* @param carActivity user info entity* @param clazz entity class* @return*/public static File createBusinessRuleFile(Car_activity carActivity, Class clazz, String[] param_texts, String[] param_values) { String ruleStr = template;String entity_package_path = (clazz+"").substring(6);String rule_name = "rule_"+carActivity.getId();String class_name = (clazz+"").substring((clazz+"").lastIndexOf(".")+1);String instance_name = class_name.toLowerCase();String rules = "";JSONArray conditionArray = JSONArray.parseArray(carActivity.getAim_condition());for(int i=0;i<conditionArray.size();i++) {JSONObject condition = conditionArray.getJSONObject(i);rules += "\r\n\t\t("+condition.getString("param")+condition.getString("operator")+condition.getString("value")+")" + AND;}rules = rules.length()>0?rules.substring(0, stIndexOf(AND)):rules;for (String param_value : param_values) {rules += "\r\n\t\t,"+param_value.toLowerCase()+":"+param_value;}String content = JSONObject.parseObject(carActivity.getContent()).getString("content");String tts = carActivity.getTts();for (int i=0;i<param_texts.length;i++) {content = content.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");tts = tts.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");}String _do = instance_name+".setCan_push(true);";_do += "\r\n\t" + instance_name+".setContent(\""+content+"\");";_do += "\r\n\t" + instance_name+".setTts(\""+tts+"\");";return returnFile(ruleStr, entity_package_path, rule_name, class_name, instance_name, _do, rules);}/*** @param ruleStr* @param entity_package_path* @param rule_name* @param class_name* @param instance_name* @param _do* @param rules* @return*/private static File returnFile(String ruleStr, String entity_package_path, String rule_name, String class_name,String instance_name, String _do, String rules) {ruleStr = ruleStr.replace("{entity_package_path}", entity_package_path).replace("{rule_name}", rule_name).replace("{class_name}", class_name).replace("{instance_name}", instance_name).replace("{do}", _do).replace("{rules}", rules);System.out.println(ruleStr);return FileUtil.getFileFromText(rule_name, ".drl", ruleStr);}}step 4.1 -- 通过字符串创建⽂件,给上⼀步⽤的函数public static File getFileFromText(String tempFileName, String fileTail, String text) {try {File file = File.createTempFile(tempFileName, fileTail);FileOutputStream fos = new FileOutputStream(file);fos.write(text.getBytes());if(fos!=null){fos.close();}return file;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}step 5 -- 规则⽂件加载,并⽤以检查当前⽤户是否满⾜下发规则条件BaseRules baseRules = new CarIllegalRules(count, money, points);if(baseRules!=null) {("before fire rules:"+baseRules);DSLUtil.fireRules(ActivityUtil.createBusinessRuleFile(car_activity, baseRules.getClass(),baseRules.getParam_text().split(","), baseRules.getParam_value().split(",")), baseRules);("after fire rules:"+baseRules);if(baseRules.isCan_push()) {//In here, the rules are used to judge the success of the entity, and you can do something}}⼩结本⽂通过对drools的简单使⽤步骤的讲解,为⼤家展⽰了drools最简单的使⽤⽅式,⽽它能做到的远远不⽌看到的这些,但是基本框架是这样,⼤家可以尝试挖掘规则⽂件的⼀些⿊操作,可以对多变的业务进⾏极致的抽象,再也不⽤为了这些重新发版啦,LOL;PS:想深⼊了解的同学还是要去看看Rete算法、drools的推理机制等等,本⽂主要从该引擎的⼊门出发哈;最后⼤家可以到我的Github上看看有没有其他需要的东西,⽬前主要是⾃⼰做的机器学习项⽬、Python各种脚本⼯具、数据分析挖掘项⽬以及Follow的⼤佬、Fork的项⽬等:。
magnum规则转drools规则_概述及解释说明

magnum规则转drools规则概述及解释说明1. 引言1.1 概述:本篇文章主要介绍了将magnum规则转换为drools规则的过程和实际应用案例分析。
在软件开发中,规则引擎起着至关重要的作用,它可以帮助我们轻松管理和执行一系列复杂的业务规则。
Magnum和Drools都是流行的规则引擎,在不同领域有广泛应用。
然而,由于Magnum和Drools之间存在一些语法和结构上的差异,因此需要将Magnum规则转换为Drools规则。
1.2 文章结构:本文共分为五个部分进行叙述。
首先,在引言部分我们对文章的背景进行了概述,并说明了文章的结构。
接下来,我们将介绍Magnum规则与Drools规则的简介,包括它们各自的特点和应用场景。
然后,我们将详细说明Magnum规则转换为Drools规则的过程步骤,并通过示例进行说明。
在第四部分中,我们会提供一个实际应用案例进行分析,包括案例背景介绍、转换流程及方法解释以及结果与效果评估。
最后,我们将总结本文主要观点并展望未来发展方向。
1.3 目的:本文的目的是为读者提供一个全面而系统的指南,帮助他们了解Magnum规则转换为Drools规则的过程,并能够在实际应用中灵活运用。
同时,通过案例分析,读者还能够更好地理解这一转换过程对于业务规则管理和执行效果的影响。
我们希望本文能够为那些需要将现有Magnum规则转换为Drools规则的开发者、项目经理和决策者提供有价值的参考,并推动相关技术在未来的研究和发展中取得进一步突破。
2. Magnum规则与Drools规则简介:2.1 Magnum规则概述:Magnum是一种规则引擎,它提供了一种用于编写和执行业务规则的框架。
该框架允许用户将业务规则与应用程序分开,以实现更高的灵活性和可维护性。
Magnum使用基于文本的规则语言,通过定义条件和行动来描述业务规则。
2.2 Drools规则概述:Drools是另一种强大的开源商业逻辑和规则管理系统。
Java规则引擎——Drools的介绍及应用

第26卷第6期2005年11月微计算机应用M ICROCO M PU IER AP PL ICAT ION S Vo l.26No.6No v.2005本文于2004-12-13收到。
Java 规则引擎)))Drools 的介绍及应用刘 伟(中国科技大学 合肥 230026)摘 要:规则引擎技术是一项很有吸引力的技术。
首先介绍了规则引擎的相关概念及其实现原理。
然后重点介绍了Jav a 规则引擎技术的规范和一个采用XM L 和jav a 语言实现的规则引擎)))Dr oo ls 。
最后给出了利用Dr oo ls 解决实际问题的范例并探讨了该技术的不足和发展前景。
关键词:规则引擎,JSR 94,DroolsIntroduction and Implementation of Drools )))a Rule Engine Based JavaLIU W ei(Univ of Sci &T ech of China,H efei,230026,China)Abstract:Rule Eng ine is a mag net ic technolog y in the ar ea o f so ftwar e developing now.In this paper,firstly,the co ncept and im plementing pr inciple of Rule Engine is int roduced,and then JSR94,the Java pro gr aming specif icat ion of Rale Engine is presented.As a pro duct of Java Rule Engine,D roo ls,is emphasized smbsequently.pr oviding an actual example,the paper descr ibes the det ails o f the usage o f Dro ds finally.Keywords:Rule Eng ine,JSR94Dr ools1 基于规则的专家系统简介Jav a 规则引擎是推理引擎的一种,它起源于基于规则的专家系统。
drools规则引擎用法

drools规则引擎用法
Drools是一个基于Java的规则引擎,可以将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
下面是使用Drools规则引擎的一般步骤:
1. 创建一个KModule配置文件,用于指定规则文件所在的目录以及默认的规则引擎等。
KModule配置文件的名称和位置都是固定的,不能更改。
2. 在KModule配置文件中,创建一个KBase元素,用于指定规则库的名称、规则文件的目录以及是否为默认规则库等。
3. 在KBase元素中,创建一个或多个KSession元素,用于指定规则执行会话的名称、是否为默认会话以及选择器等。
4. 编写规则文件,使用Drools的语法编写业务决策。
规则文件可以使用任何文本编辑器创建,并存储在指定的目录中。
5. 加载规则文件到Drools规则引擎中。
可以使用Drools提供的API进行加载,也可以在KModule配置文件中指定加载的规则文件。
6. 创建事实对象,将需要匹配的数据封装到事实对象中。
7. 将事实对象放入工作内存中,并触发规则执行。
可以使用Drools提供的API进行触发,也可以在KSession配置文件中指定触发器。
8. 规则执行后,会返回执行结果。
可以根据需要处理执行结果。
以上是使用Drools规则引擎的一般步骤,具体实现方式可能会因项目需求和开发环境而有所不同。
【原创】Drools规则引擎初窥---drl和决策表实现[实例]
![【原创】Drools规则引擎初窥---drl和决策表实现[实例]](https://img.taocdn.com/s3/m/bfe4631a54270722192e453610661ed9ad5155bf.png)
【原创】Drools规则引擎初窥---drl和决策表实现[实例]因项⽬需要,看了下drools规则引擎。
写了⼀个⽐较简单的drools的drl规则和决策表实现的例⼦。
规则说明: ⽹络商城要举办活动(奖励额外积分), 订单原价⾦额在 100以下, 不加分 100-500 加100分 500-1000 加500分 1000 以上加1000分1.建⽴最基本的Drools项⽬结构并引⼊必须的类库。
(这⾥采⽤junit来执⾏单元测试)。
创建⼀个Java Project,建⽴maven形式的源码包。
2.定义实体类Order.java1import java.util.Date;23public class Order {4private Date bookingDate;// 下单⽇期56private int amout;// 订单原价⾦额78private User user;// 下单⼈910private int score;//积分1112public Order(Date bookingDate,int amout, User user, int score){13this.bookingDate = bookingDate;14this.amout = amout;er = user;16this.score = score;17 }1819public Order(){20 }2122 //省略get、set⽅法5354 }3.定义实体User.javapublic class User {private String name;// 姓名private int level;// ⽤户级别public User(){}public User(String name, int level){ = name;this.level = level;}//省略get、set⽅法4.编写规则⽂件point-rules.drlpackage droolsimport com.wang.drools.point.Orderimport errule "zero"no-loop true//只检查⼀次lock-on-active truesalience 9 //值越⼤,优先级越⾼when//购物⾦额100以下不加分$s : Order(amout <= 100);then$s.setScore(0);update($s);endrule "add100"no-loop true//只检查⼀次lock-on-active truesalience 8 //值越⼤,优先级越⾼when//购物⾦额100以上500以下加100积分$s : Order(amout > 100 && amout <= 500);then$s.setScore(100);update($s);endrule "add500"no-loop true//只检查⼀次lock-on-active truesalience 6 //值越⼤,优先级越⾼when//购物⾦额500以上1000以下加500积分$s : Order(amout > 500 && amout <= 1000);then$s.setScore(500);update($s);endrule "add1000"no-loop true//只检查⼀次lock-on-active truesalience 5 //值越⼤,优先级越⾼when//购物⾦额1000以上加1000积分$s : Order(amout > 1000);then$s.setScore(1000);update($s);end说明:rule表⽰规则的开始,salience表⽰规则的优先级,当有多条规则同时存在是,优先级越⾼的越先被匹配执⾏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在常规开发方式中,如果涉及规则的变更(比如将物流费用从 6 元调整为 8 元),可以通过重 新完成规则的开发并发布应用来更新。或在设计上,将可能变更的规则以配置(比如数据库) 方式管理。发生规则变更时,只需修改配置即可。事实上,Drools 提供了另一种规则更新 的方式 -- 扫描 Maven 仓库(本地或远程)来自动发现规则模块的更新。 我们知道,Drools 可以利用 KieServices 来创建基于 classpath 的 KieContainer(即使用 KieServices.newKieClasspathContainer()方法)。其实,KieServices 还提供了从 Maven 仓库加载并创建 KieContainer 的方法 -- newKieContainer(ReleaseId)。与通过 classpath 创 建 KieContainer 类 似, 使 用 Maven 仓 库加 载 的 方法 , 会尝 试 读 取对 应 jar 包 中的 META-INF/kmodule.xml 文件,基于此,我们可以完成 KieSession 的创建。 我们通过一个简单的例子来观察规则的动态更新。在这个例子中,我们会将商品的折扣进行 动态调整。我们需要构建规则,并安装到 Maven 仓库中 -- 简单起见,我们将应用发布到本 地 Maven 仓库中。首先,我们创建一个 Maven 项目: $ mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.sharp.rules -DartifactId=discount
如果没什么问题,我们可以得到一个名为 discount 的文件夹,其中的 pom.xml 看起来像这 样:
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sharp.rules</groupId> <artifactId>discount</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>discount</name> <url></url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
<ksession name="rules.discount.default" /> </kbase> </kmodule>
由 于 , kbase 的 name 属 性 被 配 置 为 了 rules.discount 。 我 们 在 src/main/resources/META-INF 下,创建 rules/discount 文件夹,并在 discount 文件夹中 添加如下规则文件: package com.sharp.rules.discount
</project>
在 src/main/java/com/sharp/rules 下创建 Fact 类:
package com.sharp.rules;
public class Commodity { private double discount;
public void setDiscount(double discount) { this.discount = discount;
}
public double getDiscount() { return this.discount;
} }
这 个 类 很 简 单 , 只 包 含 一 个 discount 属 性 。 接 下 来 看 一 看 规 则 。 首 先 在 src/main/resources(若 resources 文件夹不存在,先创建它) 下创建 META-INF 文件夹,并 在 META-INF 中新建 kmodule.xml,并填入如下内容:
<?xml version="1.0" encoding="UTF-8" ?> <kmodule xmlns="/xsd/kmodule"
xmlns:xsi="/2001/XMLSchema-instance"> <kbase name="rules.discount">
import modity
rule "Set all commodities' discount - no limit" no-loop when $c: Commodity() then modify($c) { setDiscount(0.15) };
endLeabharlann 这条规则将所有的商品的折扣都设置为 15%。这里先略掉对这个项目的测试,而直接将发布 到本地的 Maven 仓库: $ mvn install
...
Installing
/path/to/project/discount/target/discount-1.0-SNAPSHOT.jar
to
/path/to/local-maven-repo/repository/com/sharp/rules/discount/1.0-SNAPSHOT/discount-1.0-SNAPSHOT.jar