规则引擎教程--交叉决策表
.NETRulesEngine(规则引擎)的使用详解

.NETRulesEngine(规则引擎)的使⽤详解⽬录RulesEngine 概述如何使⽤表达树内使⽤扩展⽅法多对象组合条件如何实现的?成功失败事件总结⼀次偶然的机会,让我拿出RulesEngine去完成⼀个业务,对于业务来说主要是完成⼀个可伸缩性(不确定的类型,以及不确定的条件,条件的变动可能是持续增加修改的)的业务判断。
⽐如说完成⼀个成就系统,管理员可创建,对于成就来说有⼀次性解锁、⽇常、周常式,还有随时重置,每次达成都触发的,⾯对着成就任务的增加,那对于程序员来说,如果每次都去增加修改这些成就任务简直是太头疼了。
好了,对此⼤家应该有⼀个简单的了解了,那跟着笔者往下⾛,我们看看如何在.NET中使⽤⾮常少的代码去完成⼀个简单的动态逻辑处理。
RulesEngine 概述RulesEngine是Microsoft推出的⼀个规则引擎项⽬,⽤于系统中抽象出的业务逻辑/规则/策略。
在我们开发的过程中,避免不了的是跟这种反反复复的业务逻辑进⾏处理,⽽对于这种动态的规则来说的话,它是⽐较优雅的⼀种⽅式,使⽤我们减少了对我们代码或者说项⽬的修改。
如何使⽤⽬前我们可以通过nuget的形式进⾏引⼊该库,如下所⽰:dotnet add package RulesEngine对于规则的配置来说,⼤家可以直接通过类型化参数,笔者主要是为了⼤家可以清晰的明⽩,所以⽤JSON化配置来做演⽰。
//反序列化Json格式规则字符串var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(rulesStr);var rulesEngine = new RulesEngine.RulesEngine(workflowRules.ToArray());//定义规则var rulesStr = @"[{""WorkflowName"": ""UserInputWorkflow"",""Rules"": [{""RuleName"": ""CheckAge"",""ErrorMessage"": ""年龄必须⼤于18岁."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""Age > 18""},{""RuleName"": ""CheckIDNoIsEmpty"",""ErrorMessage"": ""⾝份证号不可以为空."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""IdNo != null""}]}] ";如上所⽰我们定义了规则信息,对于该信息,对于规则信息笔者默认存储的还是JSON数据,当然⼤家可以进⾏存储如下内容,将如下数据结构拆分存储到数据库中。
drools Decision Table(决策表)

Drools决策表的使用1简单了解这几天在研究drools,drools到底是怎么与决策表交互的呢,报这个疑问开始了寻找之路。
●何时使用决策表——如果规则能够被表达为模板+数据的格式,那你应该考虑使用决策表。
决策表中的每一行就是对应模板的一行数据,将产生一个规则。
●运行决策表——Drools引擎所部署的系统中执行决策表。
首先,决策表转换成的Drools规则语言(DRL),然后执行规则引擎需求。
这意味着它是可能的业务规则的变更,无需停止和启动,或重新部署任何软件。
2创建java类●公共java类:Caluculation.java●执行java类及规则文件(drl文件):CalculationDrl.java和calculation.drl●执行java类及决策表(xml文件):CalculationXls.java和calculation.xls(运行决策表方法一)●执行java类及决策表(xml文件)生成规则,将得到的规则放入规则文件中(drl文件中):GenerationRules.java、calculation.xls、calculations.drl、CalculationDrlXls (运行决策表方法二)2.1.1Caluculation.javapackage com.flagleader.bean;public class Calculation {private double wage;//当月工资private double actualwage;//当月税后工资private double wagemore;//全月应纳税所得额private double cess;//税率private double preminus;//速算扣除数private double wageminus;//当月工资扣减数/*** 当月工资* @return*/public double getWage() {return wage;}public void setWage(double wage) {this.wage = wage;}/*** 当月税后工资* @return*/public double getActualwage() {return actualwage;}public void setActualwage(double actualwage) { this.actualwage = actualwage;}/*** 全月应纳税所得额* @return*/public double getWagemore() {return wagemore;}public void setWagemore(double wagemore) { this.wagemore = wagemore;}/*** 税率* @return*/public double getCess() {return cess;}public void setCess(double cess) {this.cess = cess;}/*** 速算扣除数* @return*/public double getPreminus() {return preminus;}public void setPreminus(double preminus) {this.preminus = preminus;}/*** 当月工资扣减数* @return*/public double getWageminus() {return wageminus;}public void setWageminus(double wageminus) {this.wageminus = wageminus;}public Calculation() {}public Calculation(double wage) {super();this.wage = wage;}public Calculation(double wage,double wagemore) {super();this.wage = wage;this.wagemore=wagemore;}@Overridepublic String toString() {return"当月工资="+wage+"\n当月税后工资="+actualwage+"\n全月应纳税所得额="+wagemore+"\n税率="+cess+"\n速算扣除数="+preminus+"\n当月工资扣减数="+wageminus;}}2.1.2calculation.drlpackage com.flagleader.beanglobal Calculation cal;no-loop truerule"全月应纳税额"salience 3when$cal : Calculation(wage>0)then#System.out.println("-----全月应纳税额------");c al.setWagemore(cal.getWage()-3500);update(cal);endrule"设置税率"salience 2whene val(true)then#System.out.println("-----设置税率------");i f ( cal.getWagemore()<=1500 ) {cal.setCess(0.03);cal.setPreminus(0);}else if ( cal.getWagemore()>1500 && cal.getWagemore()<=4500 ) {cal.setCess(0.1);cal.setPreminus(105);}else if (cal.getWagemore()>4500 && cal.getWagemore()<=9000 ) { cal.setCess(0.2);cal.setPreminus(555);}else if(cal.getWagemore()>9000 && cal.getWagemore()<=35000 ) { cal.setCess(0.25);cal.setPreminus(1005);}else if(cal.getWagemore()>35000 && cal.getWagemore()<=55000) { cal.setCess(0.3);cal.setPreminus(2755);}else if ( ( cal.getWagemore()>55000 &&cal.getWagemore()<=80000 ) ) {cal.setCess(0.35);cal.setPreminus(5505);}else if ( cal.getWagemore()>80000 ) {cal.setCess(0.45);cal.setPreminus(13505);}insert(cal);endrule"税后工资"salience 1whene val(true)then#System.out.println("-----税后工资------");cal.setWageminus(cal.getWagemore()*cal.getCess()-cal.getPreminus( ));c al.setActualwage(cal.getWage()-cal.getWageminus());insert(cal);end2.1.3CalculationDrl.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationDrl {static Logger logger = Logger.getLogger(CalculationDrl.class);public static void main(String[] args) {("开始");KnowledgeBuilderkBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();//规则生成器:将编写好的规则进行编译kBuilder.add(ResourceFactory.newClassPathResource("calculation.dr l", CalculationDrl.class), ResourceType.DRL);//添加规则到规则生成其中进行编译KnowledgeBase kBase=kBuilder.newKnowledgeBase();//收集应用当中的知识定义知识库对象kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());//添加规则包StatefulKnowledgeSessionsession=kBase.newStatefulKnowledgeSession();//与规则的交互通道Calculation cal=new Calculation(10000);//输入当月工资session.setGlobal("cal", cal);session.insert(cal);//将对象添加到交互通道中session.fireAllRules();//执行规则session.dispose();//释放资源System.out.println(cal.toString());("结束");}}2.1.4calculation.xls2.1.5CalculationXls.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.DecisionTableConfiguration; import org.drools.builder.DecisionTableInputType;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationXls {static Logger logger = Logger.getLogger(CalculationDrl.class);public static void main(String[] args) {("开始");DecisionTableConfigurationdtc=KnowledgeBuilderFactory.newDecisionTableConfiguration();dtc.setInputType(DecisionTableInputType.XLS);KnowledgeBuilderbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();builder.add(ResourceFactory.newClassPathResource("com/flagleader/ bean/calculation.xls",CalculationXls.class),ResourceType.DTABLE,dtc);KnowledgeBase base=builder.newKnowledgeBase();base.addKnowledgePackages(base.getKnowledgePackages());StatefulKnowledgeSessionsession=base.newStatefulKnowledgeSession();Calculation cal=new Calculation(10000,6500.0);session.insert(cal);session.fireAllRules();session.dispose();//释放资源("结束");}}2.1.6GenerationRules.javapackage com.flagleader.bean;import java.io.*;import org.drools.decisiontable.InputType;import org.drools.decisiontable.SpreadsheetCompiler;import org.junit.Test;public class GenerationRules {@Testpublic void compile() throws FileNotFoundException {File file = new File("E:\\qzxx_workspace\\calculation\\src\\main\\java\\com\\flagleade r\\bean\\calculation.xls");InputStream is = new FileInputStream(file);SpreadsheetCompiler converter = new SpreadsheetCompiler();String drl = pile(is, InputType.XLS);System.out.println("\n\n" + drl);}2.1.7calculations.drlpackage com.flagleader.bean//generated from Decision Tableimport com.flagleader.bean.Calculation;import ng.Object;function double getCes(double cess){//System.out.println("cess="+cess);return cess;}function double getPre(double preminus){//System.out.println("preminus="+preminus);return preminus;}global Calculation cal;rule"全月应纳税额"no-loop truesalience 65526when$cal : Calculation(wage>0)thenSystem.out.println("-----全月应纳税额------");c al.setWagemore(cal.getWage()-3500);update(cal);end// rule values at D11, header at D6rule"test_11"salience 65525whenCalculation(wagemore>0,wagemore<=1500) thencal.setCess(getCes(0.03));c al.setPreminus(getPre(0.00));insert(cal);end// rule values at D12, header at D6rule"test_12"salience 65524whenCalculation(wagemore>1500,wagemore<=4500) thencal.setCess(getCes(0.1));c al.setPreminus(getPre(105.00));i nsert(cal);end// rule values at D13, header at D6rule"test_13"salience 65523whenCalculation(wagemore>4500,wagemore<=9000) thencal.setCess(getCes(0.2));c al.setPreminus(getPre(555.00));i nsert(cal);end// rule values at D14, header at D6rule"test_14"salience 65522whenCalculation(wagemore>9000,wagemore<=35000) thencal.setCess(getCes(0.25));c al.setPreminus(getPre(1005.00));i nsert(cal);end// rule values at D15, header at D6rule"test_15"salience 65521whenCalculation(wagemore>35000,wagemore<=55000) thencal.setCess(getCes(0.3));c al.setPreminus(getPre(2755.00));i nsert(cal);end// rule values at D16, header at D6rule"test_16"salience 65520whenCalculation(wagemore>55000,wagemore<=80000)thencal.setCess(getCes(0.35));c al.setPreminus(getPre(5505.00));i nsert(cal);end// rule values at D17, header at D6rule"test_17"salience 65519whenCalculation(wagemore>80000,wagemore<=100000)thencal.setCess(getCes(0.45));c al.setPreminus(getPre(13505.00));i nsert(cal);endrule"税后工资"salience 65518whene val(true)thenS ystem.out.println("-----税后工资------"+cal.getCess());cal.setWageminus(cal.getWagemore()*cal.getCess()-cal.getPreminus( ));c al.setActualwage(cal.getWage()-cal.getWageminus());insert(cal);end2.1.8CalculationDrlXls.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationDrlXls {static Logger logger = Logger.getLogger(CalculationDrlXls.class);public static void main(String[] args) {("开始");KnowledgeBuilderkBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();//规则生成器:将编写好的规则进行编译kBuilder.add(ResourceFactory.newClassPathResource("calculations.d rl", CalculationDrlXls.class), ResourceType.DRL);//添加规则到规则生成其中进行编译KnowledgeBase kBase=kBuilder.newKnowledgeBase();//收集应用当中的知识定义知识库对象kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());//添加规则包StatefulKnowledgeSessionsession=kBase.newStatefulKnowledgeSession();//与规则的交互通道Calculation cal=new Calculation(10000);//输入当月工资session.setGlobal("cal", cal);session.insert(cal);//将对象添加到交互通道中session.fireAllRules();//执行规则session.dispose();//释放资源System.out.println(cal.toString());("结束");}}3决策表资料决策表\Drools的- 决策表.htm原网址:/Decision+Tables决策表\Drools的- 决策表中的业务规则解释.htm原网址:/Business+rules+in+decision+tables+explained。
【原创】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表⽰规则的优先级,当有多条规则同时存在是,优先级越⾼的越先被匹配执⾏。
Drools规则引擎入门指南(一)

Drools规则引擎⼊门指南(⼀)最近项⽬需要增加风控系统,在经过⼀番调研以后决定使⽤Drools规则引擎。
因为项⽬是基于SpringCloud的架构,所以此次学习使⽤了SpringBoot2.0版本结合Drools7.14.0.Final版本。
引⼊依赖1 2 3 4 5 6 7 8 9 10<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId> <version>7.14.0.Final</version> </dependency><dependency><groupId>org.kie</groupId><artifactId>kie-spring</artifactId> <version>7.14.0.Final</version> </dependency>创建配置类1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57@Configurationpublic class DroolsAutoConfiguration {private static final String RULES_PATH = "rules/";@Bean@ConditionalOnMissingBean(KieFileSystem.class)public KieFileSystem kieFileSystem() throws IOException {KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();for (Resource file : getRuleFiles()) {kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); }return kieFileSystem;}private Resource[] getRuleFiles() throws IOException {ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");}@Bean@ConditionalOnMissingBean(KieContainer.class)public KieContainer kieContainer() throws IOException {final KieRepository kieRepository = getKieServices().getRepository();kieRepository.addKieModule(new KieModule() {public ReleaseId getReleaseId() {return kieRepository.getDefaultReleaseId();}});KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());kieBuilder.buildAll();return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());}@Bean@ConditionalOnMissingBean(KieBase.class)public KieBase kieBase() throws IOException {return kieContainer().getKieBase();}@Bean@ConditionalOnMissingBean(KieSession.class)public KieSession kieSession() throws IOException {KieSession kieSession = kieContainer().newKieSession();return kieSession;}@Bean@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)public KModuleBeanFactoryPostProcessor kiePostProcessor() {return new KModuleBeanFactoryPostProcessor();}public KieServices getKieServices() {System.setProperty("drools.dateformat","yyyy-MM-dd");return KieServices.Factory.get();}}在这个时候我们的基本环境已经搭建好了,接下来我们⼀起来学习Drools吧HelloWord程序员的世界⾥,我们学习任何⼀门语⾔都是以HelloWord开启的,本次学习也不例外。
Activiti6系列(1)-核心数据库表及字段注释说明

Activiti6系列(1)-核⼼数据库表及字段注释说明前⾔本⽂是根据《疯狂⼯作流讲义-Activiti6.0》⼀书中提取过来的,有兴趣的可以去当当⽹买这本书,讲的很不错,最后还有实战案例。
虽然是提取过来的,但完全靠⼿打梳理,觉得有⽤的⼩伙伴可以给予⼀定⽀持,谢谢。
共分为六⼤部分1、通⽤数据表2、流程存储数据表3、⾝份数据表4、运⾏时数据表5、历史数据表6、DMN规则引擎数据表⼀、通⽤数据表1、资源表,act_ge_bytearray⽤于保存和流程引擎相关的资源,只要调⽤了Activiti存储服务的API,涉及的资源均会被转换为byte数组保存到这个表中。
⼀般情况下,Activiti使⽤这个表来保存字符串、流程⽂件的内容、流程图⽚内容。
主要包含如下字段:字段注释REV_数据版本,Activiti为⼀些有可能会被频繁修改的数据表,加⼊该字段,⽤来表⽰该数据被操作的次数。
Name_资源名称,类型为varchar,长度为255字节。
DEPLOYMENT_ID_⼀次部署可以添加多个资源,该字段与部署表act_re_deployment的主键相关联。
BYTES_资源内容,数据类型为longblob,最⼤可存4GB数据。
GENERATED_是否由Activiti⾃动产⽣的资源,0表⽰false,1为true。
2、属性表,act_ge_propertyActiviti将全部的属性抽象为key-value对,每个属性都有名称和值,使⽤act_ge_property来保存这些属性,该表有以下三个字段。
字段注释NAME_属性名称,varchar类型。
VALUE_属性值,varchar类型。
REV_数据的版本号。
⼆、流程存储数据表1、部署数据表,act_re_deployment。
部署信息会被保存在部署表中主要包含字段:字段注释NAME_部署的名称,可以调⽤Activiti的流程存储API来设置,类型为varchar,长度为255字节。
EasyRule规则引擎设计及使用说明

规则引擎使用文档2012年10月目录1.设计背景 (3)2.什么是规则引擎 (3)3.体系结构 (3)4.如何调用规则引擎 (5)5.配置使用说明 (6)6.引擎现有的公式、函数 (8)7.扩展规则引擎 (9)7.1.扩展函数 (9)7.2扩展公式 (9)8 结束语 (10)1.设计背景复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其他统一的地方,让它们能在运行时(即商务时间)可以动态地管理和修改从而提供软件系统的柔性和适应性。
规则引擎正是应用于上述动态环境中的一种解决方法。
2.什么是规则引擎为了进一步规范系统数据的有效性、完整性,加强对数据的校验在目前各个系统是必不可少的一部分,规则引擎实现对系统数据的纵向、横向校验以及表与表之间逻辑关系校验,它可以作为一个子模块添加到任意以JAVA为基础的系统当中去,同时制定相关接口规范,开发人员只需按照规范便可以对它进行二次扩展性的开发。
3.体系结构规则引擎由以下六大部分组成:1.函数:负责对数据的格式化处理,比如数据统计。
2.公式:负责对数据的逻辑处理,比如值之间比大小。
3.规则配置文件:配置校验数据的规则。
4.规则模型配置文件:配置校验数据规则的集合。
5.公式、函数配置文件:配置系统所有相关的函数以及公式。
6.引擎主程序:调用规则引擎的入口。
7.数据库配置文件:与数据库相关的配置文件。
以上几大部分均可由开发人员灵活配置以便后续再次扩展,程序类包机构如下如下:规则文件节点属性类系统数据源接口数据计算公式接口数据计算函数接口规则引擎入口主程序工具类数据库操作接口计算公式、函数容器配置文件规则文件数据库配置类图如下:4.如何调用规则引擎将规则引擎作为子模块加入的主业务系统后,主业务系统只需在程序里调用规则引擎的com.git.easyrule.service.RuleService类的runRule()和runModel()方法即可,规则引擎启动之后便根据自身的规则配置项对数据进行校验处理,处理结果将存入规则文件配置的指定表当中。
Visual-Rules规则引擎产品介绍-PPT课件

在线服务请求支持
提供7×24小时的在线技术支持服务,包括提供专门的客户热线电话、网站、邮件、msn等在线方式,及专职的客服人员受理客户服务请求(咨询、建议、投诉和故障等); 提供标准的故障分级请求处理流程和规范,并在标准定义的基础上自动上升一个级别;
产品信息通知和预见服务
通过各种在线渠道(电话、电子邮件、网站)提供产品新的动态(新版本计划、新产品发布、重大BUG修正)
规则引擎提供哪些对外接口 规程引擎是否支持流程控制 对于规则的变更历史如何保存、查询、利用 规则引擎版本升级问题是如何解决(例如:费用、升级的方式是否平滑) 规则引擎分布式部署,负载均衡问题 权限控制问题
*
*
规则引擎是否支持规则变更的热部署
自动编译规则包
表格
规则
参数
手工发布规则包
表格
规则
参数
规则引擎(热部署、同步更新)
软件修补 和升级
软件修补
提供软件的修补 (Patch)版本安装包下载的快速通道; 仅限于软件小版本; 对于甲方发现的软件BUG,以书面形式提交乙方,乙方按照BUG的严重级别在一到五个工作日内答复解决方案,并免费修正BUG。
应用 举例
公司 情况
产品 介绍
产品 特色
旗正规则引擎
业务人员和技术支持人员共同维护规则包中的规则
*
*
*
旗正发展历程
产品功能架构
应用 举例
公司 情况
产品 介绍
产品 特色
旗正规则引擎
Rule的定义 Rule的管理 界面管理 Parameter 管理 Rule热部署 Rule模拟执行
业务逻辑调用接口
业务通用模块 ( …)
业务规则作为企业资产管理
RuleEngine (规则引擎学习介绍)

Java规则引擎商业产品主要有
Java规则引擎开源项目
• JBoss Rules(Drools ) • 具有一个易于访问企业策略、易于调整以
及易于管理的开源业务规则引擎,符合业 内标准,速度快、效率高。业务分析师或 审核人员可以利用它轻松查看业务规则, 从而检验是否已编码的规则执行了所需的 业务规则。
规则语言
• JSR 94中没有涉及用来创建规则和动作的
语言.规则语言是规则引擎应用程序的重要 组成部分,所有的业务规则都必须用某种语 言定义并且存储于规则执行集中,从而 规则 引擎可以装载和处理他们。
名称及其网址列出如下
• Rule Markup language (RuleML)
/ Simple Rule Markup Language (SRML) /srml.html Business Rules Markup Language (BRML) /brml.html SWRL: A Semantic Web Rule Language Combining OWL and RuleML /2003/11/swrl/
Production System)是一个基于Java的演绎 法(Forward-Chaining)规则引擎.这个规则引 擎被用于在Java 应用服务器,Java客户端程 序,和Servlets中通过规则来提高它们的商业 处理能力.
Java规则引擎开源项目
• InfoSapient • InfoSapient是一个开源的规则引擎.它设计
Rete算法其核心
• Rete算法其核心思想是将分离的匹配项根
据内容动态构造匹配树,以达到显著降低 计算量的效果
Java规则引擎
• 目前主流的规则引擎组件多是基于Java和
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交叉决策表
交叉决策表 (1)
1.1 业务需求 (2)
2.1规则实现 (2)
2.1.1 规则包创建 (2)
2.1.2 变量定义 (3)
2.1.3 创建交叉决策表 (3)
2.1.4 规则实现 (4)
3.1 测试 (9)
3.1.1规则单元测试 (10)
3.1.2 批量测试 (10)
1.1 业务需求
现需解决每个员工每个月(上半年)的基本业务工资。
由于每个员工每个月都有相对应的工资,同样的每个月也对应着每个员工,他们之间存在一一对应的关系。
这里我们就可以设计个“交叉决策表”,把月份和员工分别作为“交叉决策表”的横向和纵向条件,把工资作为“交叉决策表”的赋值元素。
需要注意的是:交叉决策表的赋值元素只能有一个!
员工的工资清单如下:
2.1规则实现
2.1.1 规则包创建
右键名为“功能解析”的工程,点击“新建规则包”,创建一个名为:“交叉决策表的”规则包,如下图所示:
2.1.2 变量定义
该规则包中需要在对象库中,定义三个变量:员工姓名(name),月份(month),基本工资(salary)。
如下图所示:
2.1.3 创建交叉决策表
右键名为“交叉决策表”的规则包,选择添加“交叉决策表”。
添加完成后,需将该决策表重命名为“员工基本工资”,操作截图如下所示:
创建了“员工基本工资”的“交叉决策表”之后,需处理该决策表的业务逻辑。
2.1.4 规则实现
在该例“交叉决策表”中,有两个条件:员工姓名、月份。
但是在“交叉决策表”中,横向条件是缺省存在的,所以在该“交叉决策表”的属性窗口只需一个纵向条件,然后在“赋值元素”中选择“基本工资”。
设置完成后,“交叉决策表”的属性如下图所示:
属性设置完成后,我们要为该交叉决策表设置对应的条件,操作步骤如下图所示:
员工姓名设置完成以后,我们还要在条件部分添加6种月份信息。
双击“基本工资”右下方的黑色区域,设置如下图所示的逻辑,步骤如下图所示:
确认后,我们可以看到下图所示的页面:
最后我们依次修改每个员工,每个月份的的工资,完成的结果如下:
我们点击图中黑色框中的“交叉决策表条件”,可以看到具体的逻辑。
如下图所示:
注:“交叉决策表”的横向条件缺省存在的且只能有一个;纵向条件可以设置多个,在每个纵向条件中可以存在多个不同的子条件,最后所有的的纵向条件和横向条件交叉组成新条件。
3.1 测试
我们在规则编写完成之后,都需为规则进行保存、编译。
点击“全部保存”,配置器就会自动保存并编译所有未保存规则包,过程如下:
保存后,我们可以在消息窗口看到如下消息:
如果出现上述的两条信息,说明该规则包已经编译成功!规则包保存编译以后,我们需要测试该规则包的输出结果正确性。
规则包的测试有两种方式:一种是批量测试、另一种是规则单元测试。
3.1.1规则单元测试
规则单元测试一次只能测试一条数据,若需测试其他情况,需要修改初始输入值,再测试一遍。
测试的步骤和结果,按照下图所示的进行:
3.1.2 批量测试
在批量测试中,一次测试可以测试任意条测试数据。
测试数据可以从excel中导入,也可以把excel中的数据导入到批量测试中。
首先,需要在规则包中添加批量测试,添加过程如下图所示:
完成后,我们需要添加测试用例,如下图所示:
Visual Rules Solution 旗正规则引擎
11
点击“添加”后,将会出现下图所示的页面,按图中所示添加一个测试用例:
传入值:就是测试输入值;期望结果值:在该输入值下,期望得到的结果值。
若测试输出结果值与期望结果值不同,在消息窗口会出现红色字体的错误提示;若相同,测试完成!
我们再多添加几个测试用例。
添加完成后,点击下图所示的测试按钮,测试完成后的结果如下图所示:
从上图中,我们可以看到所有的期望值与实际结果值相同,测试通过!在消息记录窗口的消息记录如下图所示:。