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.testwrod
	rule “test001”
		when
		  eval(true);
		then
		  System.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.testwrod
		rule “test001”
			when
				//这里如果为空 则表示eval(true);
			then
		       System.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();
		then
		  ntln(“hello ”+$p.getName());
	end	

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值