本文主要是介绍Drools Hello world,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Drools的基本工作过程
之前我们一般的做法都是使用一个接口进行业务的工作,首先要传进去参数,其次要获取到接口的实现执行完毕后的结果。其实Drools也大相径庭,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。
在drools中,这个传递数据进去的对象,术语叫 Fact对象。Fact对象是一个普通的java bean(小编是这样理解的),规则中可以对当前对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到working Memory(内存储存)中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前working Memory中插入删除新的fact对象。
注:何为fact对象 下面只是小编对fact对象的一些理解和认知,有说的不对的地方还请指点 Fact对象 Fact是指在Drools规则应用当中,将一个普通的JavaBean插入到规则的WorkingMemory当中后的对象。规则可以对Fact对象进行任意的读写操作,当一个JavaBean插入到WorkingMemory当中变成Fact之后,Fact对象不是对原来的JavaBean对象进行Clon(克隆),而是原来JavaBean对象的引用。 规则进行计算的时候需要用到应用系统当中的数据,这些数据设置在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.drl
package rules.testwrodrule “test001”wheneval(true); thenSystem.out.println(“hello world”);end
上面的例子是最简单的一个规则,只要触发该规则时,就会在控制空 输出 helloworld,那么这几个都代表的是什么意思呢,说的这三大块内容以是什么呢,小编这里给大家分析一下上面的例子,
首先:规则文件及扩展名,hello.drl 规则名是可以随便起的,不要求像java 首字母大写,这里小编要提示一下读者,规则名起名最好还是规范,见名知意。
Drl文件内容:
package 这就是三大块中的包路径,这里的路径是逻辑路径,理论上是可以随便写的,但不能不写。但为了更方便的开发,这里小编提醒大家最好与文件目录同名,像java 一下以点(.)的方式隔开
rule 就是三大块中的规则体,以rule开头,以end 结尾,每个规则文件可以包含多个rule。规则体分为三个部分,LHS RHS 属性 三大部分,下面小编会对这三个部分做一个简单的说明,在语法详情的篇章里,会有说明的。
LHS:条件部分又被称之为 LeftHand Side,简称为 LHS,在一个规则当中 when 与 then 中间的部分就是 LHS 部分。在 LHS 当中,可以包含 0~n 个条件,如果 LHS 部分没空的话,那么引擎会自动添加一个eval(true)的条件,由于该条件总是返回 true,所以 LHS 为空的规则总是返回 true。
也就是这样的效果
hello.drl
package rules.testwrodrule “test001”when//这里如果为空 则表示eval(true);thenSystem.out.println(“hello world”);end
RHS:结果部分又被称之为 RightHand 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永远是第一行
比如:
importcom.drools.demo.point.PointDomain; 导入类
importfunction com.drools.demo.point.PointDomain.getById; 导入静态方法
例如下面代码:
hello.drl
package rules.testwrod
import cn.test.Person;rule “test001”when$p:Person();thenntln(“hello ”+$p.getName());end
下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的
----请看下方↓↓↓↓↓↓↓
百度搜索 Drools从入门到精通:可下载开源全套Drools教程
深度Drools教程不段更新中:
更多Drools实战陆续发布中………
扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓
这篇关于Drools Hello world的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!