欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Drools技术指南完整.docx

    • 资源ID:95126047       资源大小:2.08MB        全文页数:98页
    • 资源格式: DOCX        下载积分:30金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要30金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Drools技术指南完整.docx

    Drools 技术指南 Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。JBoss Rules 的前身是 Codehaus 的一个开源项目叫 Drools。最近被纳入JBoss 门下,更名为 JBoss Rules,成为了 JBoss 应用服务器的规则引擎。Drools 是为 Java 量身定制的基于 Charles Forgy 的 RETE 算法的规则引擎的实现。具有了 OO 接口的 RETE,使得商业规则有了更自然的表达。Drools 的简要概述Drools 是一款基于 Java 的开源规则引擎,以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策,从而给编程带来了极大的方便。 下图就是引用了规则引擎后的效果:图(1-1)Drools 新特性 Drools 推出了一套新的基于 KIE 概念的 API,其目的是将之前版本中对规则引擎繁琐的调用和加载过程加以简化。 Drools6 给我的最大不同就是把 rules 打包成 jar,使用端通过 kie-ci 来动态从 maven repo 中获取指定 rules jar 版本,虽然和 maven 有紧耦合,简化以及清晰了 rules 的使用和动态升级,例如:系统建立 2 个项目:一个 Drools 项目来实现规则,验收规则,生成 jar 包,另外一个就是真正要用规则的项目,直接通过引入不同版本的 jar 包实习规则动态升级。 引入业务规则技术的目的对系统的使用人员· 把业务策略(规则)的创建、修改和维护的权利交给业务经理 · 提高业务灵活性 · 加强业务处理的透明度,业务规则可以被管理 · 减少对 IT 人员的依赖程度 · 避免将来升级的风险 对 IT 开发人员 · 简化系统架构,优化应用 · 提高系统的可维护性和维护成本 · 方便系统的整合 · 减少编写“硬代码”业务规则的成本和风险 这里引用了一位 Drools 大咖的博客文章 如果大咖看到了,请谅解。小编在这里先谢谢您啦 MK 大神! 应用场景· 为提高效率,管理流程必须自动化,尽管现代商业规则异常复杂。 · 市场要求业务规则经常变化,系统必须依据业务规则的变化快速、低成本的更新。 · 为了快速、低成本的更新,业务人员应能直接管系统中的规则,不需要程序开发人员参与。 作用与优点:· 将业务规则与业务系统分离,解耦合; · 实现自然语言描述规则逻辑,业务人员易于理解; · 可视化的规则定制、审批、查询及管理; · 能有效的提高实现复杂逻辑的代码的可维护性; · 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内; · 符合组织对敏捷或迭代开发过程的使用; 如下如所示: (图:1-2) Drools 的基本工作过程 之前我们一般的做法都是使用一个接口进行业务的工作,首先要传进去参数,其次要获取到接口的实现执行完毕后的结果。其实Drools 也大相径庭,我们需要传递进去数据, 用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。注:何为 fact 对象下面只是小编对 fact 对象的一些理解和认知,有说的不对的地方还请指点Fact 对象Fact 是指在 Drools 规则应用当中,将一个普通的JavaBean 插入到规则的 WorkingMemory 当中后的对象。规则可以对 Fact对象进行任意的读写操作,当一个 JavaBean 插入到WorkingMemory 当中变成 Fact 之后,Fact 对象不是对原来的 JavaBean对象进行Clon(克隆),而是原来 JavaBean 对象的引用。在 drools 中,这个传递数据进去的对象,术语叫 Fact 对象。Fact 对象是一个普通的java bean(小编是这样理解的),规则中可以对当前对象进行任何的读写操作,调用该对象提供的方法,当一个 java bean 插入到 working Memory(内存储存)中,规则使用的是原有对象的引用,规则通过对 fact 对象的读写,实现对应用数据的读写,对于其中的属性, 需要提供getter setter 访问器,规则中,可以动态的往当前working Memory 中插入删除新的 fact 对象。规则进行计算的时候需要用到应用系统当中的数据,这些数据设置在 Fact 对象当中,然后将其插入到规则的WorkingMemory 当中,一个 Fact 对象通常是一个具有 getter 和 setter 方法的 POJO 对象,通过 getter 和 setter 方法可以方便的对 Fact 对象 f 进行操作,所以我们可以简单的把 Fact 对象理解为规则与应用系统数据交互的桥梁或通道。当 Fact 对象插入到 WorkingMemory 当中后,会与当前 WorkingMemory 当中所有的规则进行匹配,同时返回一个FactHandler 对象。FactHandler 对象是插入到 WorkingMemory 当中Fact 对象的引用句柄,通过 FactHandler 对象可以实现对对应的 Fact 对象通过 API 进行删除及修改等操作。 Drools 文件多变的扩展名说了这么多,这规则引擎是个什么文件呢,也是*.java *.class *.js 之类的?当然不是,规则引擎可以分为多种方式,最原始也是最基本的是*.drl 文件,当然也可以是*.xml 的方式,还可以是*.xls or *.xlsx 的方式;看着就很灵活是吧。Drools Hello world在上面的文章里,我们对 Drools 有一个简单的认识,在这里章节里,小编对详细的对 Drools语法进行一个说明:在小编看来 Drools 的基础语法可分为三块内容,包路径、引用、规则体;一个最简单的规则至少要包含“包路径”,”规则体“这两部分。下面我们就写一个 hello world。hello.drlpackage rules.testwrodrule “test001”wheneval(true);thenSystem.out.println(“hello world”);end上面的例子是最简单的一个规则,只要触发该规则时,就会在控制空 输出 hello world,那么这几个都代表的是什么意思呢,说的这三大块内容以是什么呢,小编这里给大家分析一下上面的例子,首先:规则文件及扩展名,hello.drl规则名是可以随便起的,不要求像 java 首字母大写, 这里小编要提示一下读者,规则名起名最好还是规范,见名知意。Drl 文件内容: package 这就是三大块中的包路径,这里的路径是逻辑路径,理论上是可以随便写的,但不能不写。但为了更方便的开发,这里小编提醒大家最好与文件目录同名,像 java 一下以点(.)的方式隔开rule 就是三大块中的规则体,以 rule 开头,以 end 结尾,每个规则文件可以包含多个 rule。规则体分为三个部分,LHS RHS 属性 三大部分,下面小编会对这三个部分做一个简单的说明,在语法详情的篇章里,会有说明的。LHS:条件部分又被称之为 Left Hand Side,简称为 LHS,在一个规则当中 when 与 then中间的部分就是 LHS 部分。在 LHS 当中,可以包含 0n 个条件,如果 LHS 部分没空的话,那么引擎会自动添加一个 eval(true)的条件,由于该条件总是返回 true,所以 LHS 为空的规则总是返回 true。也就是这样的效果hello.drlpackage rules.testwrodrule “test001”when/这里如果为空 则表示 eval(true);thenSystem.out.println(“hello world”);endRHS:结果部分又被称之为 Right Hand Side,简称为 RHS,在一个规则当中 then 后面部分就是 RHS,只有在 LHS 的所有条件都满足时 RHS 部分才会执行。RHS 部分是规则真正要做事情的部分,可以将因条件满足而要触发的动作写在该部分当中,在 RHS 当中可以使用 LHS 部分当中定义的绑定变量名、设置的全局变量、或者是直接编写 Java 代码(对于要用到的 Java 类,需要在规则文件当中用 import 将类导入后方能使用,这点和 Java 文件的编写规则相同)。我们知道,在规则当中 LHS 就是用来放置条件的,所以在 RHS 当中虽然可以直接编写Java 代码,但不建议在代码当中有条件判断,如果需要条件判断,那么请重新考虑将其放在 LHS 当中,否则就违背了使用规则的初衷。在 Drools 当中,在 RHS 里面,提供了一些对当前 Working Memory 实现快速操作的宏函数或对象,比如 insert/insertLogical、update/modify 和 retract 就可以实现对当前Working Memory 中的 Fact 对象进行新增、修改或者是删除;如果您觉得还要使用 Drools 当中提供的其它方法,那么您还可以使用另一外宏对象 drools,通过该对象可以使用更多的操作当前 Working Memory 的方法;同时 Drools 还提供了一个名为 kcontext 的宏对象, 使我们可以通过该对象直接访问当前 Working Memory 的 KnowledgeRuntime。这里我们有提到了 import,这是一个什么概念呢,其实很简单,就是引入所需要的 Java 类或方法。import:导入规则文件需要使用到的外部变量,这里的使用方法跟 java 相同,但是不同于java 的是,这里的 import 导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。小编这里要提醒一下读者,在规则文件里 package 永远是第一行比如:import com.drools.demo.point.PointDomain; 导入类import function com.drools.demo.point.PointDomain.getById; 导入静态方法例如下面代码: hello.drlpackage rules.testwrod import cn.test.Person; rule “test001”when$p:Person(); thenntln(“hello ”+$p.getName();endDrools 的API 调用在上一章节里,小编简单的讲述了规则文件的编辑语法与规范,读者还没有看过 rule 的执行过程,下面我们就通过例子对 rule 进行一下调用。在 Drools 当中,规则的编译与运行要通过 Drools 提供的各种API 来实现,这些 API 总体来讲可以分为三类:规则编译、规则收集和规则的执行。在调用时,我们先要做以下几个操作:1、Kmodule.xml 的编辑kmodule.xml 文件放到src/main/resources/META-INF/文件夹下(图 2-1)代码的实现(具体内容)<?xml version="1.0" encoding="UTF-8"?><kmodule xmlns="http:/www.drools.org/xsd/kmodule"><kbase name="kbase1" packages="rules.testwrod"><ksession name="session"/></kbase></kmodule><project xmlns="http:/maven.apache.org/POM/4.0.0" xmlns:xsi="http:/www.w3.org/2001/XMLSchema- instance" xsi:schemaLocation="http:/maven.apache.org/POM/4.0.0 http:/maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.drools.modules.test</groupId> <artifactId>drools-moudles</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>drools-moudles</name> <url>http:/maven.apache.org</url> 2、API 的说明,创建一个 java 文件Mavne pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!- drools 规则引擎 版本 -> <drools.version>7.0.0.Final</drools.version> <spring.version>4.2.6.RELEASE</spring.version> <log4j2.version>2.5</log4j2.version> </properties> <!- 依赖项定义 -> <dependencies> <!- start drools -> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-workbench-models-guided-template</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-simulator</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-flow-builder</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-spring</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-internal</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-workbench-models-guided-dtable</artifactId> <version>$drools.version</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>$drools.version</version> </dependency> <!- end drools -> </dependencies> <build> <testResources> <testResource> <directory> $project.basedir/src/main/resources </directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project> package com.drools.test; import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; JAVA code public class TestWrod public static void main(String args) KieServices kss = KieServices.Factory.get(); KieContainer kc = kss.getKieClasspathContainer(); KieSession ks =kc.newKieSession("session"); int count = ks.fireAllRules(); System.out.println("总执行了"+count+"条规则"); ks.dispose(); 分析 java 代码 从 classpath 中读取 kmodule,创建 KieContainder 容器。 利用 kieContainer 对象创建一个新的 KieSession,创建 session 的时候我们传入了一个name: session”,这个字符串很眼熟吧,这个就是我们定义的 kmodule.xml 文件中定义的ksession 的 name。 kieContainer 根据 kmodule.xml 定义的 ksession 的名称找到 KieSession 的定义,然后创建一个 KieSession 的实例。 KieSession 就是一个到规则引擎的链接,通过它就可以跟规则引擎通讯,并且发起执行规则的操作。 然后通过 kSession.fireAllRules 方法来通知规则引擎执行规则 ks.dispose();最后将 kiesession 连接关闭 那让我们看一下结果 如图 2-2 (图 2-2) 上面只最简单的 hello world 了,是不是很容易就懂了呢,好!那小编再增加一点点难度,我们往规则里插入一个值,来进行一个简单的业务判断。 业务说明:判断人名是张三,年龄 30 岁,就将该人名改为李四实体 POJO package com.drools.test; public class Person private String name; private int age; private String desc; public Person(String name, int age) this.name = name; this.age = age; .此处省略 get set 方法,但读者做例子时一定要加上哦 规则代码如下: Person.drl package rules.testwrod import com.drools.test.Person rule test001 when $p:Person(name="张三",age=30); then $p.setName("李四"); System.out.println("改完后的名字"+$p.getName(); end 在 API 代码说明import org.kie.api.KieServices;import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.FactHandle;public class TestWrodpublic static void main(String args)KieServices kss = KieServices.Factory.get(); KieContainer kc = kss.getKieClasspathContainer(); KieSession ks =kc.newKieSession("session"); Person person=new Person("张三",30); FactHandle insert = ks.insert(person);int count = ks.fireAllRules();System.out.println("总执行了"+count+"条规则"); System.out.println(person.getName(); ks.dispose();那让我们看一下结果 如图 2-3 (图 2-3) 在控制台上我们可以看到是我们想要的结果。在规则里变了,java 中的 Bean 也发生了变化,这就满意了我们业务上的要求? 小编为什么在最后打了一个问号呢,我们的真的改变了 fact 对象嘛,是我们真正想要的结果嘛,看起来是没问题的,控制台也输出,但如果我稍稍修改一下业务的话,在之前的业务上添加 并将名为李四的的年龄设置为 40,那我规则就应该是这样了 规则代码如下: Person.drl package rules.testwrodimport com.drools.test.Person rule test001when$p:Person(name="张三",age=30);then$p.setName("李四");System.out.println("改完后的名字"+$p.getName();endrule test002when$p:Person(name="李四");then$p.setAge(40);System.out.println("改完后的名字"+$p.getName()+"改完后的年龄"+$p.getAge();endjava 的代码不变,执行结果,我们发现结果与第一次相同,难道是我们写的代码没有编译?为什么没有生效呢,test001 规则明明已经将 Person 中的 name 属性改为“李四”了那为什么值规则 test002 没有执行呢,这里小编就要郑重的提一句了,这是因为 rete 的算法问题,什么是 rete 算法呢,在后面的章节里小编会做一个详细的说明,好!,那小编先带着读者解决这个问题。其实解决起来很简单,只要在第一个规则里添加之前所说的update 就可以了。 将 test001 规则中的 then 中 $p.setName("李四");下方添加 update($p);再次运行那让我们看一下结果 如图 2-4 (图 2-4) 注:小编是这样认为的:其实导致这个原因的是因为rete 算法的问题,简单说明一下,rete 算法会将规则中的内容先全部加载出来,我们在规则中看似把Person 的name 属性改变了,但本质中只是引用发生了改变,fact 对象是没有真正改变的。当fact 对象发生真正改变时,规则将重新执行,但这样是有风险的,容易产生死循环。解决方案会在rule 的属性中有说明 Drools7 版本关于 session 的不同方法小编为什么会要将 session 独立出来一个章节呢,这是有原因的,我们在开发过程会遇到各种情况,这个 session 的状态是很重要的,也会在开发中经常使用。 KieSession 用于与规则引擎进行交互的会话。会话分为两类: l 有状态的 KieSession l 无状态的 StatelessKieSession KieSession 有状态的 KieSession 会在多次与规则引擎进行交互中,维护会话的状态。 定义 KieSession,在 kmodule.xml 文件中定义 type 为 stateful 的 session: <ksession name="stateful_session" type="stateful"></ksession> 注意:stateful 是 type 属性的默认值。获取 KieSession 实例 KieSession statefulSession = kieContainer.newKieSession("stateful_session"); 接下来,可以在 KieSession 执行一些操作。最后,如果需要清理 KieSession 维护的状态,调用 dispose()方法。 StatelessKIESession 与 KieSession 相反,StatelessKIESession 隔离了每次与规则引擎的交互,不会维护会话的状态。 如果将 session 比作编程语言中的函数,StatelessKIESession 就是无副作用的函数。StatelessKIESession 适用场景: 数据校验 运算 数据过滤 消息路由 任何能被描述成函数或公式的规则 定义 StatelessKIESession,在 kmodule.xml 文件中定义 type 为 stateless 的 session: <ksession name="stateless_session" type="stateless"></ksession> 如果我们想要用无状态的 kie-session 的话就必须这样定义了。获取 StatelessKIESession 实例: StatelessKieSession statelessKieSession = kieContainer.newStatelessKieSession("stateless_session"); /通过 KieServices 获取 command 工厂类 KieCommands: KieCommands commandFactory = kieServices.getCommands(); /可以使用工程类 KieCommands 调用 newXXXCommand 开头的方法创建 command 实例。 /会话执行 command: statelessKieSession.execute(command); /分隔线 source code 调用的是该接口 public interface StatelessRuleSession void execute(java.lang.Object o); void execute(java.lang.Iterable iterable); StatelessKnowledgeSessionImpl 实现类 public void execute(Object object) StatefulKnowledgeSession ksession = newWorkingMemory(); try ksession.insert( object ); ksession.fireAllRules(); finally dispose(ksession); 从代码中我们可以看出来,也是通过 finally 中的 dispose 方法来删除的,只是与kieSession 方式不同。 Drools 内部功能详细介绍规则文件 在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是一个标准的文本文件,所以可以通过一些记事本工具对其进行打开、查看和编辑。规则是放在规则文件当中的,一个规则文件可以存放多个规则,除此之外,在规则文件当中还可以存放用户自定义的函数、数据对象及自定义查询等相关在规则当中可能会用到的一些对象。 一个标准的规则文件的结构代码清单: 除 package 之外,其它对象在规则文件中的顺序是任意的,也就是说在规则文件当中必须要有一个package 声明,同时 package 声明必须要放在规则文件的第一行,规则文件当中的 package 和 Java 语言当中的 package 有相似之处,但不完全相同。在 Java 当中package 的作用是用来对功能相似或相关的文件放在同一个 package 下进行管理,这种package 管理既有物理上Java 文件位置的管理也有逻辑上的文件位置的管理,在 Java 当中这种通过 package 管理文件要求在文件位置在逻辑上与物理上要保持一致;但在 Drools 的规则文件当中 package 对于规则文件中规则的管理只限于逻

    注意事项

    本文(Drools技术指南完整.docx)为本站会员(暗伤)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开