规则引擎DROOLS简明教程

合集下载

drools 数据库加载规则

drools 数据库加载规则

drools 数据库加载规则Drools是一个基于规则引擎的开源项目,它可以用来管理和执行业务规则。

Drools可以从数据库中加载规则,这个过程需要遵循一定的规则和流程。

下面将详细介绍Drools数据库加载规则的步骤和注意事项。

一、准备工作在开始加载规则之前,需要做一些准备工作,包括:1. 创建数据库表首先需要在数据库中创建一个表来存储规则信息。

表的结构可以根据实际情况进行设计,但至少应该包含以下字段:- id:规则的唯一标识符- name:规则的名称- content:规则的内容- version:规则的版本号- status:规则的状态(启用/禁用)2. 编写规则文件接下来需要编写一个Drools规则文件,其中包含了要加载到数据库中的所有业务规则。

这个文件应该使用.drl扩展名,并且遵循Drools语法。

3. 配置数据源最后需要配置数据源,在Drools配置文件中指定要使用的数据库类型、连接信息等。

二、加载流程完成了上述准备工作之后,就可以开始加载业务规则了。

整个过程分为以下几个步骤:1. 读取数据库中的规则信息首先需要从数据库中读取要加载的规则信息。

可以使用JDBC或者其他ORM框架来实现这个功能。

读取到的规则信息应该是一个列表,其中每个元素包含了规则的id、name、content等信息。

2. 构建KnowledgeBuilder接下来需要构建一个KnowledgeBuilder对象,用于编译规则文件和数据库中读取到的规则信息。

可以使用Drools提供的API来创建KnowledgeBuilder对象。

3. 编译规则文件使用KnowledgeBuilder对象编译规则文件,将其转换为可执行的Drools规则。

4. 编译数据库中读取到的规则信息使用KnowledgeBuilder对象编译从数据库中读取到的规则信息,将其转换为可执行的Drools规则。

5. 合并所有编译后的规则将编译后的规则文件和数据库中读取到的规则信息合并成一个完整的Drools知识库。

[Drools]JAVA规则引擎(非常好的一篇教程)

[Drools]JAVA规则引擎(非常好的一篇教程)

[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开发教程、规则引擎

Drools开发教程、规则引擎

Drools5规则引擎规则引擎开发开发教程教程教程高杰上海锐道信息技术有限公司2009-8-201.学习前的准备Drools是一款基于Java的开源规则引擎,所以在使用Drools之前需要在开发机器上安装好JDK环境,Drools5要求的JDK版本要在1.5或以上。

1.1. 开发环境搭建大多数软件学习的第一步就是搭建这个软件的开发环境,Drools也不例外。

本小节的内容就是介绍如何搭建一个Drools5的开发、运行、调试环境。

1.1.1.下载开发工具Drools5提供了一个基于Eclipse3.4的一个IDE开发工具,所以在使用之前需要到网站下载一个 3.4.x版本的Eclipse,下载完成之后,再到/drools/downloads.html网站,下载Drools5的Eclipse插件版IDE及Drools5的开发工具包,如图1-1所示。

图1-1除这两个下载包以外,还可以把Drools5的相关文档、源码和示例的包下载下来参考学习使用。

将下载的开发工具包及IDE包解压到一个非中文目录下,解压完成后就可以在Eclipse3.4上安装Drools5提供的开发工具IDE了。

1.1.2.安装Drools IDE打开Eclipse3.4所在目录下的links目录(如果该目录不存在可以手工在其目录下创建一个links目录),在links目录下创建一个文本文件,并改名为drools5-ide.link,用记事本打开该文件,按照下面的版本输入Drools5 Eclipse Plugin文件所在目录:path=D:\\eclipse\\drools-5.0-eclipse-all这个值表示Drools5 Eclipse Plugin文件位于D盘eclipse目录下的drools-5.0-eclipse-all 下面,这里有一点需要注意,那就是drools-5.0-eclipse-all文件夹下必须再包含一个eclipse 目录,所有的插件文件都应该位于该eclipse目录之下,接下来要在win dos下重启Eclipse 3.4,检验Drools5 IDE是否安装成功。

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

magnum规则转drools规则_概述及解释说明

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是另一种强大的开源商业逻辑和规则管理系统。

Drools入门

Drools入门

Drools⼊门⼀、背景知识:1、什么是规则引擎Java规则引擎起源于基于规则的专家系统,⽽基于规则的专家系统⼜是专家系统的其中⼀个分⽀。

专家系统属于⼈⼯智能的范畴,它模仿⼈类的推理⽅式,使⽤试探性的⽅法进⾏推理,并使⽤⼈类能理解的术语解释和证明它的推理结论。

推理引擎包括三部分:模式匹配器(Pattern Matcher)、议程(Agenda)和执⾏引擎(Execution Engine)。

推理引擎通过决定哪些规则满⾜事实或⽬标,并授予规则优先级,满⾜事实或⽬标的规则被加⼊议程。

模式匹配器决定选择执⾏哪个规则,何时执⾏规则;议程管理模式匹配器挑选出来的规则的执⾏次序;执⾏引擎负责执⾏规则和其他动作。

和⼈类的思维相对应,推理引擎存在两者推理⽅式:演绎法(Forward-Chaining)和归纳法(Backward-Chaining)。

演绎法从⼀个初始的事实出发,不断地应⽤规则得出结论(或执⾏指定的动作)。

⽽归纳法则是根据假设,不断地寻找符合假设的事实。

Rete算法是⽬前效率最⾼的⼀个 Forward-Chaining推理算法,许多Java规则引擎都是基于Rete算法来进⾏推理计算的。

推理引擎的推理步骤如下:(1)将初始数据(fact)输⼊Working Memory。

(2)使⽤Pattern Matcher⽐较规则库(rule base)中的规则(rule)和数据(fact)。

(3)如果执⾏规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放⼊冲突集合。

(4)解决冲突,将激活的规则按顺序放⼊Agenda。

(5)使⽤执⾏引擎执⾏Agenda中的规则。

重复步骤2⾄5,直到执⾏完毕所有Agenda中的规则。

上述即是规则引擎的原始架构,Java规则引擎就是从这⼀原始架构演变⽽来的。

Drools是基于正向推理的规则引擎。

正向推理是数据驱动的,facts事实被传递到⼯作空间中,在那⾥有⼀个或多个规则与这些事实匹配,并由Agenda安排执⾏—我们从⼀个事实开始,传递事实,最后得到⼀个结论。

drools使用数据库存储规则

drools使用数据库存储规则

drools使用数据库存储规则Drools是一个业务规则管理系统(BRMS)解决方案,它允许业务规则在业务环境中进行管理、部署和执行。

Drools提供了基于规则引擎的框架,允许业务规则与业务逻辑分离,使业务规则可以根据业务需求进行动态更改。

在Drools中,规则通常存储在`.drl`文件中,这些文件包含了业务规则的声明和逻辑。

然而,Drools也支持从数据库中加载和存储规则。

以下是如何使用数据库存储和加载规则的基本步骤:1. 设置数据库连接:首先,你需要设置数据库连接。

这通常涉及到配置JDBC 驱动、URL、用户名和密码等。

2. 创建数据库表:你需要创建一个表来存储规则。

这个表通常会有一些字段,如规则ID、规则名称、规则描述等。

3. 加载规则:在Drools中,你可以使用`ksession.getKieBase().add打包资源`.drl`文件`方法来添加规则文件。

但是,如果你想从数据库中加载规则,你需要编写一个自定义的`KieServices`实现,该实现可以从数据库中读取规则并返回一个`KieModule`对象。

4. 使用数据库存储规则:你也可以使用数据库来存储和更新规则。

这通常涉及到将`.drl`文件的内容存储到数据库表中,并使用自定义的`KieServices`实现来从数据库中读取规则。

5. 更新KieBase:当你从数据库中加载了新的规则后,你需要更新`KieBase`以反映这些更改。

6. 使用规则:最后,你可以像往常一样使用Drools来触发规则,并根据规则的结果执行相应的逻辑。

需要注意的是,直接从数据库存储和加载规则可能会对性能产生影响,特别是当你有大量的规则或频繁的规则更新时。

因此,在使用这种方法之前,请确保它适合你的业务需求和环境。

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)。
2)设置传递到 url 脚本的参数实例:
WorkingMemory workingMemory = businessRules.newWorkingMemory();
workingMemory.assertObject(xxx);
3)执行规则:
workingMemory.fireAllRules(filter); //filter 规则为过虑器
规则引擎—— Drools 2 实例应用指南
本文给出了如何利用 Drools 来执行业务规则实例。 在将这个例子之前,我先简单的介绍规则引擎的工作步骤。 1)加载 rul 规则描述脚本:
RuleBase businessRules = RuleBaseLoader.loadFromUrl(url);
package com.primeton.juxtapose.rule.example;
/** * 简单的 JavaBean 保存 student 值。用于存放与学生相关的信息。 * 包括 姓名、年龄、性别、是否推荐入学等。 * * 根据学生的性别、年龄等判断该学生是否可以入读某一学校。 * 如: 某女子学校可能只接受性别为女的学生; * 某学校可能只接受年龄大于 15 岁的学生入学; * 某女子学校可能只接受性别为女且年龄大于 18 岁的学生入学; * ...... * * @author liuxiang * */ public class Student { //常量 public final static String YES="YES"; public final static String NO="NO";
在以前的文章中,“用 Drools 让你的商业逻辑使用框架”,我介绍了 Drools 框架,展示了它如何用 来组织复杂的商业逻辑。Drool 用一组简单的,众所周知的事物替换了许多缠杂的 if…then 表达 式。如果你经历过和商业客户的会议,并为他们提出的想要实现的东西的复杂程度搞得头痛,或 许你应该考虑一下像 Drools 这样的规则引擎了。这篇文章将向你展示如何在企业级 Java 应用中 使用 Drools.
this.schoole = schoole; } /** * 获得孩子希望就读的学校 * @return */ public String getSchoole(){ return this.schoole; } }
2。对于业务逻辑考虑用一个简单得 Java 类来实现,用来模拟执行商业逻辑。类 BusinessLogicLayer,用于模拟商业逻辑的执行。
Drools Drools 被设计为可插入式的语言实现。目前规则能用 Java, Python 和 Groovy 实现。更为重要 的是,Drools 提供了声明式程序设计(Declarative Programming),并且使用域描述语言 (Domain Specific Languages (DSL))-专为你的问题域定义了某种模式的 Xml, 它已经足够 灵活到可以用来描述你的问题域。DSLs 包含的 XML 元素(Element)和属性(Attribute)代表了问 题域中各种要素。
这段时间企业级 Java 简直能让你睡着。有多少 J2EE-EJB 应用程序只是从网页提取数据并把它们 存 入 到 数 据 库 中 ?但 开 发 者 真 正 应 该 开 发 和 维 护 的 却 是 他 们 应 用 程 序 中 复 杂 的 商 业 逻 辑 。这 个 问 题 不仅仅适用于将要新应用,而且渐渐地,也适用于那些长期运行的商业核心应用,它们的内部逻 辑也需要经常改变,而且往往要求在一个非常短的时间内。
一路到底的框架
大多数开发者都有自己喜爱的框架。无特定顺序,它们包括表现层框架(Struts, JSF, Cocoon 和 Spring),持久化框架(JDO, Hibernate, Cayenne and Entity Beans)以及结构框架(EJB, 又是 Spring, Pico 和 Excalibur), 还有其它很多。每种框架都各有所长,给开发者提供子许多“即 开即用”的功能。使用框架来部署应用意味着你避免了许多让人厌烦的细节,让你集中注意力到关 键之处。 到目前为直,在框架所能做的事中仍然有一个缺口,那就是商业逻辑没有框架。像 EJB 和 Spring 这样的工具虽好,但它们却几乎没有提及怎么组织你的那些 if …then 语句。把 Drools 加到你的 开发工具箱中意味着现在你可以“一路到底”的使用框架来构建你的应用程序。图 1 显示了这样的 一个应用
答 案 是 :“ 令 人 吃 惊 的 好 ”。大 多 数 开 发 者 只 是 因 为 不 愿 “失 控 ” 而 依 赖 于 他 人 的 代 码( 比 如 :某 种 框 架),想想这个:Drools 不仅可以让你的应用和“传统”的编程方法一样快,甚至可以更快,看下面:
● 避免糟糕的代码:Drools 引导开发者去做“正确的事”。你可以确定你正在写的代码是好的,但 你的开发伙伴呢?你可以同样这样说吗?使用框架可以让你更轻松地写出更快,更好的代码。
● 我的应用程序有多复杂?对于那些只是把数据从数据库中传入传出,并不做更多事情的应用程 序,最好不要使用规则引擎。但是,当在 Java 中有一定量的商业逻辑处理的话,可以考虑 Drools 的使用。这是因为很多应用随着时间的推移越来越复杂,而 Drools 可以让你轻松应对这一切。
● 我的应用的生命周期有多久?这个问题的正确答案往往是“令人惊讶的长”――还记得那些认为 他们的程序不会苟活到 2000 年的大型机的程序员吗?使用规则引擎将会在中长期得到好处。像 这篇文章所展示的那样,甚至原型都能从 Drools 与灵活方法的组合中获益,让“原型系统”转化成 生产系统。
/** * 设置学生姓名 * @param studentName */ public void setStudentName(String studentName){ this.studentName = studentName; } /** * 获得学生姓名 * @return */ public String getStudentName(){ return this.studentName; } /** * 设置学生年龄 * @param studentAge
● 优化过的框架:你有多少次看见商业逻辑重复地从数据库中提取相同的信息,从而降低了整个 应用的速度?如果正确使用的话,Drools 不仅仅能够记住信息,而且还能记住以往使用该信息进 行测试的结果,从而大幅提升应用的速度。
● Rete 算法:很多次我们并不是真正需要使用“if ”条件。被 Drools 实现的 Rete 算法,可以用一 个优化的方法替换掉所有的“if…then”表达式。需要重点提及的是:Rete 算法在使用更多的内存 来降低运行时延迟方面作了折衷。当然这在现代的应用服务器中并不是一个问题,我们也并不推 荐你在移动手机上使用 Drools!
//内部变量 private String studentName =null; private int studentAge = 0; private String studentSex = null; private String recommend = null; private String schoole = null;
rul 的语法比较简单,从以下例子中就能体会出来,这里不讲述了。
考虑这样一种情况,某学校 USST 希望招收的学校其年龄应该大于 15 岁,另外一个学校 FUDAN 希望其招收的学生大于 18 岁.当然,不同的学校对学生的要求可能不一样,例如年龄、性别、成绩 等。如果采用大量的 if...else 语句写在业务逻辑层,将来随着学校招生的要求变化,需要应用程 序开发人员,不断的修改业务规则。现在考虑采用 Drools 来使商务逻辑从应用程序中分离出来。 1。首先设计一个 Student 类,包括姓名、年龄、性别、希望就读学校。类文件如下:
/** * 一个简单的业务逻辑层,用来模拟商业逻辑。 * * @author liuxiang * */ public class BusinessLogicLayer { private static final String BUSINESS_RULE_FILE="BusinessRulesStudent.drl"; private static RuleBase businessRules = null;
package com.primeton.juxtapose.rule.example;
import java.io.IOException; import org.drools.DroolsException; import org.drools.IntegrationException; import org.drools.RuleBase; import org.drools.WorkingMemory; import org.drools.event.DebugWorkingMemoryEventListener; import org.drools.io.RuleBaseLoader; import org.drools.spi.Activation; import org.drools.spi.AgendaFilter; import org.xml.sax.SAXException;
*/ public void setStudentAge(int studentAge){ this.studentAge = studentAge; } /** * 获得学生年龄 * @return */ public int getStudentAge(){ return this.studentAge; } /** * 设置学生性别 * @param studentSex */ public void setStudentSex(String studentSex){ this.studentSex = studentSex; } /** * 获得学生性别 * @return */ public String getStudentSex(){ return this.studentSex; } /** * 设置是否推荐入学 * @param recommend */ public void setRecommend(String recommend){ this.recommend = recommend; } /** * 获得是否推荐入学 * @return */ public String getRecommend(){ return this.recommend; } /** * 设置孩子希望就读的学校 * @param schoole */ public void setSchoole(String schoole){
相关文档
最新文档