《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

简介: 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

RHS语法

使用说明

RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息。RHS主要用于处理结果,因此不建议在此部分再进行业务判断。如果必须要业务判断需要考虑规则设计的合理性,是否能将判断部分放置于LHS,那里才是判断条件应该在的地方。同时,应当保持RHS的精简和可读性。

如果在使用的过程中发现需要在RHS中使用AND或OR来进行操作,那么应该考虑将一根规则拆分成多个规则。


RHS的主要功能是对working memory中的数据进行insert、update、delete或modify操作,Drools提供了相应的内置方法来帮助实现这些功能。


update(object,handle):执行此操作更新对象(LHS绑定对象)之后,会告知引擎,并重新触发规则匹配。

update(object):效果与上面方法类似,引擎会默认查找对象对应的handle。


使用属性监听器,来监听JavaBean对象的属性变更,并插入到引擎中,可以避免在对象更改之后调用update方法。当一个字段被更改之后,必须在再次改变之前调用update方法,否则可能导致引擎中的索引问题。而modify关键字避免了这个问题。


insert(newSomething()):创建一个新对象放置到working memory中。


insertLogical(newSomething()):功能类似于insert,但当创建的对象不再被引用时,将会被销毁。


delete(handle):从working memory中删除对象。


其实这些宏函数是KnowledgeHelper接口中方法对应的快捷操作,通过它们可以在规则文件中访问Working Memory中的数据。预定义变量drools的真实类型就是KnowledgeHelper,因此可以通过drools来调用相关的方法。具体每个方法的使用说明可以参考类中方法的说明。


通过预定义的变量kcontext可以访问完整的Knowledge Runtime API,而kcontext对应的接口为KieContext。查看KieContext类会发现提供了一个getKieRuntime()方法,该方法返回KieRuntime接口类,该接口中提供了更多的操作方法,对RHS编码逻辑有很大作用。


insert函数

insert的作用与在Java 类当中调用KieSession的insert方法效果一样,都是将Fact对象插入到当前的Working Memory当中,基本用法格式如下:


insert(newSomething());

1

调用insert之后,规则会进行重新匹配,如果没有设置no-loop为true或lock-on-active为true的规则,如果条件满足则会重新执行。update、modify、delete都具有同样的特性,因此在使用时需特别谨慎,防止出现死循环。

规则文件insert.drl


package com.rules
import com.secbro.drools.model.Product
rule "insert-check"
    salience 1
    when
       $p : Product(type == GOLD);
     then
        System.out.println("insert-check:insert Product success and it's type is " + $p.getType());
     end
rule "insert-action"
    salience 2
    when
    then
        System.out.println("insert-action : To insert the Product");
        Product p = new Product();
        p.setType(Product.GOLD);
        insert(p);
    end

测试代码:

@Test
public void commonTest(){
    KieServices kieServices = KieServices.get();
    KieContainer kieContainer = kieServices.getKieClasspathContainer();
    KieSession kieSession = kieContainer.newKieSession("ksession-rule");
    int count = kieSession.fireAllRules();
    kieSession.dispose();
    System.out.println("Fire " + count + " rules!");
}

打印日志:

insert-action : To insert the Product
insert-check:insert Product success and it's type is GOLD
Fire 2 rules!

根据优先级首先执行insert操作的规则,然后执行结果检测。


update函数

update函数可对Working Memory中的FACT对象进行更新操作,与StatefulSession中的update的作用基本相同。查看KnowledgeHelper接口中的update方法可以发现,update函数有多种参数组合的使用方法。在实际使用中更多的会传入FACT对象来进行更新操作。具体的使用方法前面章节已经有具体例子,不再重复示例。


image.pngdelete函数

将Working Memory中的FACT对象删除,与kession中的retract/delete方法效果一样。同时delete函数和retract效果也相同,但后者已经被废弃。


modify函数

modify是基于结构化的更新操作,它将更新操作与设置属性相结合,用来更改FACT对象的属性。语法格式如下:


modify ( <fact-expression> ) {

   <expression> [ , <expression> ]*

}


其中fact-expression必须是FACT对象的引用,expression中的属性必须提供setter方法。在调用setter方法时,不必再写FACT对象的引用,编译器会自动添加。

rule "modify stilton"
when
    $stilton : Cheese(type == "stilton")
then
    modify( $stilton ){
        setPrice( 20 ),
        setAge( "overripe" )
    }
end


目录
相关文章
|
Java 应用服务中间件 API
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
243 0
《Drools7.0.0.Final规则引擎教程》第3章 3.2 KIE概念&FACT对象
|
Java 测试技术 API
《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例
《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例
239 0
《Drools7.0.0.Final规则引擎教程》第3章 3.1 Hello World 实例
|
Java 编译器
《Drools7.0.0.Final规则引擎教程》第4章 Function函数
《Drools7.0.0.Final规则引擎教程》第4章 Function函数
244 0
《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
《Drools7.0.0.Final规则引擎教程》第4章 4.9 关键字
209 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
179 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
195 0
|
Java
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件
180 0
《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用
《Drools7.0.0.Final规则引擎教程》番外实例篇——相同对象and List使用
316 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience
337 0
|
算法
《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
《Drools7.0.0.Final规则引擎教程》第4章 global全局变量
419 0