Drools规则引擎的使用总结

合集下载

drools的使用

drools的使用

drools的使用摘要:1.概述2.Drools 的基本概念3.Drools 的使用方法4.Drools 的应用实例5.总结正文:1.概述Drools 是一款业务规则管理系统(BRMS) 的开源引擎,它可以帮助企业在业务决策中实现自动化、统一和优化。

通过使用Drools,企业可以轻松地定义、部署和执行复杂的业务规则,从而提高业务效率和降低运营成本。

2.Drools 的基本概念在开始使用Drools 之前,我们需要了解一些基本的概念,包括:- 规则:规则是Drools 的核心,它是一种用于描述业务逻辑的表达式。

规则通常由条件和动作组成,当条件满足时,规则会执行相应的动作。

- 规则引擎:规则引擎是Drools 的核心组件,它负责解析和执行规则。

规则引擎可以根据业务需求,自动调整规则的执行顺序和方式。

- 知识库:知识库是Drools 中存储规则和相关数据的地方。

知识库可以是文件、数据库或内存中的数据结构,方便企业对业务规则进行统一管理和维护。

3.Drools 的使用方法使用Drools 的过程可以分为以下几个步骤:- 安装和配置Drools:首先,需要在计算机上安装Drools,并配置相应的环境变量。

- 创建知识库:然后,需要创建一个知识库,用于存储业务规则和相关数据。

- 编写规则:接下来,需要编写业务规则,并将其添加到知识库中。

- 部署规则:完成规则编写后,需要将规则引擎部署到业务系统中,以便将规则应用到实际业务中。

- 执行规则:最后,规则引擎会自动执行规则,并根据业务需求调整规则的执行顺序和方式。

4.Drools 的应用实例Drools 广泛应用于各种行业和领域,例如金融、保险、医疗和零售等。

下面是一个简单的应用实例:假设一家保险公司需要根据客户的年龄、性别和保险类型来计算保费。

可以使用Drools 来完成这个任务,首先需要创建一个知识库,用于存储相关的业务规则和数据。

然后,编写一条规则,用于计算保费。

drools的使用

drools的使用

Drools的使用什么是DroolsDrools是一个基于Java的规则引擎,它能够帮助开发者以一种简单、易于理解的方式来管理和执行业务规则。

它提供了一个强大的规则引擎,允许用户定义和管理业务规则,并将这些规则应用到应用程序中的数据上。

Drools的核心是一个基于规则的语言,即Drools Rule Language(DRL)。

通过使用DRL,开发者可以定义规则、条件和操作,以及规则之间的关系。

Drools引擎可以解析和执行这些规则,并根据规则的评估结果进行相应的操作。

Drools的优势Drools具有以下几个优势:1. 灵活性Drools允许开发者以一种灵活的方式定义规则,并根据实际需求进行修改和调整。

规则可以通过简单的文本编辑器进行编写,也可以通过使用Drools提供的规则编辑器进行可视化编辑。

这使得开发者能够快速响应业务需求的变化,并进行规则的动态更新。

2. 可读性和可维护性Drools的规则语言(DRL)采用了一种易于理解的语法,使得规则的编写和维护变得简单。

规则可以根据业务需求进行组织和分组,使得规则的管理和维护更加清晰和可靠。

此外,Drools还提供了一些工具和插件,可以帮助开发者进行规则的调试和测试,进一步提高规则的可读性和可维护性。

3. 高性能Drools引擎是一个高性能的规则引擎,它能够处理大量的规则和数据,并在短时间内完成规则的评估和操作。

Drools引擎采用了一些优化策略,如规则的编译和缓存,以提高规则的执行效率。

此外,Drools还支持多线程和分布式处理,可以进一步提高规则引擎的性能和扩展性。

4. 与Java的无缝集成Drools是一个基于Java的规则引擎,它可以与Java应用程序无缝集成。

开发者可以使用Java代码调用Drools引擎,并将规则应用到Java对象上。

Drools提供了一些API和工具,可以帮助开发者在Java应用程序中使用规则引擎,使得规则的集成变得简单和方便。

Drools 规则引擎的使用总结

Drools 规则引擎的使用总结

前一段时间在开发了一个做文本分析的项目。

在项目技术选型的过程中,尝试使用了Drools 规则引擎。

让它来作为项目中有关模式分析和关键词匹配的任务。

但后来,因为某种原因,还是撇开了Drools。

现将这个过程中使用Drools的一些经验和心得记录下来。

?(一)什么时候应该使用规则引擎这实际是一个技术选型的问题。

但这个问题又似乎是一个很关键的问题(一旦返工的话,你就知道这个问题是多么重要了)。

不知大家有没有过这样的经验和体会。

往往在项目开始的时候,总会遇到应该选用什么技术是不是应该使用最新的技术或者应该选用什么技术呢(PS:现在计算机软件中的各种技术层出不穷,具有类似功能的技术很多)?不管怎么样,这些问题总会困扰着我。

比如,这次的这个项目。

项目要求是要在一些log 文件中(这些log文件都是很大的应用系统所产生的,但由于legacy的原因,log本身的维护和规范工作一直没有得到改善,所以想借助于一些外部应用对这些log做以分析和清洗)抽取出有用的信息。

于是,第一个想到的就是,这是一个文本挖掘类的项目。

但又想,要抽取有用信息,必须得建立一些规则或pattern(模式)。

所以,我第一个想到了规则引擎。

因为这里面要建立好多规则,而这些规则可以独立于代码级别(放到一个单独的drl文件里)并可以用规则引擎去解析和执行。

另一个重要的原因是,我原来用过,比较熟悉。

这样,也可以节省开发时间吧。

于是,好不犹豫的就开始做了Demo....但事实上,在经历了一个多星期的编码、测试后,我发现运用规则引擎实在是太笨拙了。

(1)首先必须建立一些数据模型。

通过这些模型来refer规则文件中的LHS和Action。

(2)还要考虑规则的conflict。

如果有一些规则同时被触发,就要考虑设定规则的优先级或者是设定activiation-group来保证在一个group中的规则只有一个规则可以被触发。

(3)对于‘流’规则group ruleflow-group的使用。

drools 规则重复执行

drools 规则重复执行

drools 规则重复执行Drools是一个基于Java的开源规则引擎,它可以在应用程序中执行规则,根据给定的条件和动作进行推理和决策。

Drools规则引擎的重复执行是指规则引擎在特定条件下重复执行规则的过程。

本文将探讨Drools规则引擎的重复执行机制以及其在实际应用中的一些使用场景。

让我们了解Drools规则引擎的基本原理。

Drools规则引擎基于规则的条件和动作进行推理和决策。

规则由两部分组成:条件和动作。

条件是指规则引擎需要满足的前提条件,而动作是在条件满足时需要执行的操作。

当给定的条件满足时,规则引擎会执行相应的动作。

Drools规则引擎的重复执行是指规则引擎在满足条件的情况下,可以多次执行规则。

这是通过规则引擎的循环执行机制实现的。

当规则引擎执行完一次规则后,它会重新评估条件,并根据条件的变化情况决定是否需要再次执行规则。

如果条件仍然满足,规则引擎将继续执行规则,直到条件不再满足为止。

Drools规则引擎的重复执行机制可以在很多实际应用中发挥作用。

例如,在订单处理系统中,可以使用Drools规则引擎来执行一系列的订单验证规则。

当新的订单被创建时,规则引擎可以根据一组预定义的规则来验证订单的合法性。

如果订单不符合规则的条件,规则引擎可以执行相应的动作,如发送警报或拒绝订单。

在订单处理过程中,规则引擎可以重复执行规则,以确保订单的合法性。

另一个使用Drools规则引擎的场景是风险管理系统。

在金融领域,风险管理是非常关键的一项任务。

Drools规则引擎可以用于执行一系列的风险评估规则。

当新的交易发生时,规则引擎可以根据一组预定义的规则来评估交易的风险。

如果交易的风险超过了设定的阈值,规则引擎可以执行相应的动作,如发送警报或拒绝交易。

在风险管理过程中,规则引擎可以重复执行规则,以及时发现和应对风险。

除了以上应用场景,Drools规则引擎的重复执行还可以用于数据清洗和数据分析等领域。

在数据清洗过程中,规则引擎可以执行一系列的数据清洗规则,以确保数据的准确性和完整性。

drools语法规则

drools语法规则

drools语法规则Drools是一个规则引擎,它允许开发人员以声明性的方式定义和执行业务规则。

Drools语法规则定义了规则的结构、语义以及如何使用它来编写规则。

Drools规则由两个部分组成:左手边(LHS)和右手边(RHS)。

LHS 用于规定规则的前置条件,而RHS用于规定规则的操作。

在Drools中,规则以关键字“rule”开头,后跟规则的名称。

规则的格式如下:```droolsrule "rule_name"attributeswhenconditionsthenactionsend```规则的名称是可选的,如果没有提供名称,Drools将自动生成一个唯一的名称。

以下是Drools规则中常见的语法元素:1. 属性(attributes):规则可以具有一些可选的属性,用于配置规则的行为。

这些属性在规则的名称之后,条件之前定义。

例如:```droolsrule "rule_name"salience 10when...```2. 前置条件(conditions):前置条件指明了规则的触发条件。

这些条件必须为真才能使规则执行相应的操作。

条件语句通常使用基于模式的匹配来匹配事实。

例如:```droolsrule "rule_name"when$person : Person(age > 18)...```在上面的例子中,条件`$person : Person(age > 18)`匹配具有年龄大于18的Person对象。

3. 规则操作(actions):规则操作指定了规则满足条件时要执行的动作。

这些动作可以修改规则中使用的事实(数据对象),可以插入或者删除事实,或者执行其他的操作。

例如:```droolsrule "rule_name"then$person.setEligible(true);update($person);...```在上面的例子中,RHS中的操作调用了`setEligible(true)`方法来修改了`$person`对象的状态,并使用`update`方法通知规则引擎对对象进行更新。

规则引擎-drools使用讲解(简单版)-Java

规则引擎-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的项⽬等:。

Drools规则引擎应用看这一篇就够了

Drools规则引擎应用看这一篇就够了

Drools规则引擎应⽤看这⼀篇就够了1 .场景1.1需求商城系统消费赠送积分100元以下, 不加分100元-500元加100分500元-1000元加500分1000元以上加1000分......1.2传统做法if (order.getAmout() <= 100){order.setScore(0);addScore(order);}else if(order.getAmout() > 100 && order.getAmout() <= 500){order.setScore(100);addScore(order);}else if(order.getAmout() > 500 && order.getAmout() <= 1000){order.setScore(500);addScore(order);}else{order.setScore(1000);addScore(order);}interface Strategy {addScore(int num1,int num2);}class Strategy1 {addScore(int num1);}......................interface StrategyN {addScore(int num1);}class Environment {private Strategy strategy;public Environment(Strategy strategy) {this.strategy = strategy;}public int addScore(int num1) {return strategy.addScore(num1);}}以上解决⽅法问题思考:如果需求变更,积分层次结构增加,积分⽐例调整?数据库?遇到的问题瓶颈:第⼀,我们要简化if else结构,让业务逻辑和数据分离!第⼆,分离出的业务逻辑必须要易于编写,⾄少单独编写这些业务逻辑,要⽐写代码快!第三,分离出的业务逻辑必须要⽐原来的代码更容易读懂!第四,分离出的业务逻辑必须⽐原来的易于维护,⾄少改动这些逻辑,应⽤程序不⽤重启!2.是什么2.1概念规则引擎由发展⽽来,是⼀种嵌⼊在应⽤程序中的组件,实现了将业务决策从应⽤程序代码中分离出来,并使⽤预定义的语义模块编写业务决策。

drools规则引擎用法

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规则引擎的一般步骤,具体实现方式可能会因项目需求和开发环境而有所不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前一段时间在开发了一个做文本分析的项目。

在项目技术选型的过程中, 尝试使用了 Drools规则引擎。

让它来作为项目中有关模式分析和关键词匹配的任务。

但后来,因为某种原因, 还是撇开了 Drools 。

现将这个过程中使用 Drools 的一些经验和心得记录下来。

(一)什么时候应该使用规则引擎 ~这实际是一个技术选型的问题。

但这个问题又似乎是一个很关键的问题(一旦返工的话, 你就知道这个问题是多么重要了)。

不知大家有没有过这样的经验和体会。

往往在项目开始 的时候,总会遇到应该选用什么技术?是不是应该使用最新的技术?或者应该选用什么技术 呢(PS :现在计算机软件中的各种技术层出不穷,具有类似功能的技术很多)?不管怎么样,这些问题总会困扰着我。

比如,这次的这个项目。

项目要求是要在一些 文件中(这些log 文件都是很大的应用系统所产生的,但由于legacy 的原因,log 本身的维 护和规范工作一直没有得到改善,所以想借助于一些外部应用对这些log 做以分析和清洗)抽取出有用的信息。

于是,第一个想到的就是,这是一个文本挖掘类的项目。

但又想,要抽取有用信息,必 须得建立一些规则或 pattern (模式)。

所以,我第一个想到了规则引擎。

因为这里面要建 立好多规则,而这些规则可以独立于代码级别(引擎去解析和执行。

另一个重要的原因是,我原来用过,比较熟悉。

这样,也可以节省开发 时间吧。

于是,好不犹豫的就开始做了 Demo....但事实上,在经历了一个多星期的编码、测试后,我发现运用规则引擎实在是太笨拙了。

(1)首先必须建立一些数据模型。

通过这些模型来refer 规则文件中的LHS 和Action 。

(2 )还要考虑规则的 conflict 。

如果有一些规则同时被触发,就要考虑设定规则的优先 级或者是设定activiation-group 来保证在一个group 中的规则只有一个规则可以被触发。

(3)对于 流'规则group ruleflow-group 的使用。

如果要控制在 workingmemory 中的规则被触发的顺序,则可以将这些规则分组。

然后, 通过规则建模的方式来实现。

但这也添加了一定的effort 。

修改或者更新不大方便。

~所以,基于上述体会,我更认为规则引擎更适用于那些对非流程性规则匹配的应用。

当 然,Drools 也支持对流程性规则的建模过程。

但,这也许不是最好的方式。

(二) Drools 规则引擎的使用杂记(1) Fact 的变更监听。

在Drools 里,如果一个Fact 通过规则而改变,则需将这种 改变通知给规则引擎。

这里,一般有两种方式:显式和隐式。

显式---在drl 文件中通过 up date 、modify 来通知;在程序中,通过 Fact 的引用调用 modifyObject等方法来实现。

隐式---通过在Java bea n 实现property Liste ner In terface来让引擎自动监听到属性值的变化。

我更习惯于这种方式。

因为,一般看来凡是在规则引擎中添加到 fact 都是希望引擎来帮你进行管理的。

所以,那它自己看到 fact 的变化是种很省事的办法。

也很简单,就是用Java bean property 监听的方式。

通过 StatefulSession 来注册。

调用 StatefulSession的某个 instanee 的 insert ( Object ,true )实现。

而这个 object是一个java bean 。

其中,要实现P rivate final Prop ertyCha ngeS upport cha ngesProp ertyCha ngeS upp ort( this );public void add PropertyChangeListener(final PropertyChangeListener l) { this.cha nges.add Prop ertyChangeListe ner( l );log放到一个单独的drl 文件里)并可以用规则=newthis.cha nges.fire Prop ertyCha nge ( "te mp", null,this.te mp );(2)规则触发的优先级、组设置往往,在设计我们自己的规则时, 要考虑规则的触发条件。

这不仅限于LHS 的条件部分, 还有规则本身被触发的有些设置等等。

这里,列出一些比较常用和有效的规则优先级设置方—式,以及需要注意的地方。

A. 通过Salienee 方式。

此值可正可负。

越大优先级越高,也会被引擎首先执行。

B.通过ruleflow-group 方式。

实际上,使用这种方式也就是在使用建立规则流的方式。

在Eclipse 3.3 中,Drools 提供了建立规则流的插件。

要在 两个文件(当然,插件会帮助你建立这些)。

克NewSelect a wizardWizards:|typs filter text出凸CVS□ & Dr&olsr- -O Declfibn Table;© DoiTiain Specific Language ■ 0 Guided Rule.吨 RuleFlow File■-Q Rule ProjectQ Rule Resoir 匚ee EfChpse Made ling Frameu^crkD Example EMF McMJe'l Creation VVizarcte选择 RuleFlow File 。

这里,需要注意的一点是要在启动规则引擎的时候,加入启动drl 的同级目录中建立 rf 和rfmNejit >Fl, ashCancelrule flow 的代码。

P ublic void removeProp ertyCha ngeListe nerfinal Prop ertyCha ngeListe ner I) {Inpu tStreamReader source = new Inpu tStreamReader(RuleMa nager.class.getResourceAsStream(rule_ path));P ackageBuilder builder = new P ackageBuilder(); builder.add PackageFromDrl(source);builder.addRuleFlow (new Inpu tStreamReader(RuleMa nager.class.getResourceAsStream(rule_fl ow_p ath)));Package pkg = builder.get Package 。

;RuleBase ruleBase = RuleBaseFactory. newRuleBase(); ruleBase.add Package (p kg);然后,在每次启动规则引擎的时候,调用如下方法:StatefulSessi on ss;ss.start Pro cess(flow Progress) ss.fireAllRules();这个rule flow 图中,显示了一个简单的规则流。

如RSA 就是一个rule-flow 的名字。

在这个rule set 中可以设定一组rules 。

这样,就可以分开规则执行的顺序。

在于 的另一个drl 文件中定义这些组的名字。

通过关键字ruleflow-group来表明。

C.通过activation-group 的方式。

通过这种方式,可以exclude 一组rule 中一旦有一个rule 被invoke ,而其它 rule 不会被 execute 。

同时,可以搭配使用 salienee 关键字来标明 每个rule 的优先级,这样就能够使得你想要的一般性概念的 D.在使用ruleflow-group 的时候要注意使用 lock-on-active true 关键字在每个 rule 。

这flow 的名字。

rf 和rfm 同名rule 先被匹配执行。

样可以避免一旦有rule被触发,不会造成循环匹配执行。

E.如果在LHS部分,需要调用某个方法来返回真、假值作为判断的一个条件,那么可以=用eval函数。

女0, eval(pattern.matched(5,$line.getCurrLine()))其中,pattern是某个加入到workingmemory 中的一个实例。

matched是这个实例所代表类的一个方法。

它返回boolean类型。

(3)Drools规则引擎的使用感受总之,Drools还是一个很不错的开源规则引擎。

现在v4.0以上的版本已经比以前的版本在速度上有了很大的提升。

可以作为我们一般应用程序系统的中间件产品(那些规则不是很经常改变的系统,已经非流程类规则)。

但是,这其中还是需要一些额外的effort来学习它的使用文档以及整体架构,有一定的学习曲线。

最后,我想一个较好的对于技术使用的Practice就是:首先知道它能为你做什么,它最好的应用领域,然后再去深入。

(PS:如果谁有使用Drools的问题,可以联系我!一起讨论!)题外话:Drools是规则引擎,主要是用于实现基于规则的专家系统的。

而专家系统是什么,要解决什么样的问题,可能大家不是很清楚。

所以在解决问题是,要首先有个全面的了解才行。

如果只是流程型的东西,可以考虑工作流引擎实现。

另外,对话引擎是很复杂的,涉及很多技术,NPL、推理机、知识库,甚至包含整个人工遛能领域的技术。

而其中每个技术又有不同的理论和方法,选择哪个,又如何组合这些技术也是很复杂的。

基于条件匹配方式的规则引擎必定存在一个抽象分析的过程,而且你很难控制流程式的逻辑的执行。

我们做的VisualRules也称做一个规则引擎产品,但是我们不是按照条件匹配的方式来做的。

我们是顺序执行的。

因此可以通过分支来实现决定规则执行的轨迹,甚至可以做循环类的规则。

另外可以直接在规则中操作数据库,以便于提取一些参数以及存取操作。

其实最开始我们研发这个产品时,也碰到匹配算法将规则配置变得非常难,研究挺长时间的程序员要设计规则都觉得分析的难度挺大。

不要说将来的维护人员或者业务人员。

相关文档
最新文档