drools规则引擎内置方法update insert retract (七)

1,drools内置方法

    规则文件的RHS部分的主要作用是通过插入,删除或修改工作内存中的Fact数据,来达到控制规则引擎执行的目的。Drools提供了一些方法可以用来操作工作内存中的数据,操作完成后规则引擎会重新进行相关规则的匹配,原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。

     创建实体类

package com.dream21th.drools.study.demo4;

import lombok.*;

import java.util.List;

/*
 * @Author dream21th
 **/
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private String name;

    private String result;

    private Integer age;

    private String sex;

    private List<String> subjects;
}

2,内置方法update

    update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。

    创建规则文件:

package rules;
import  com.dream21th.drools.study.demo4.Student;

rule "demo4_update_1"
    when
       $s:Student( age==10)
    then
       $s.setAge(20);
       update($s)
       System.out.println("触发demo4_update_1:年龄等于"+$s.getAge());
end

rule "demo4_update_2"
    when
       $s:Student(age==20)
    then
       $s.setAge(30);
       update($s)
       System.out.println("触发demo4_update_2:年龄等于"+$s.getAge());
end

rule "demo4_update_3"
    when
       $s:Student(age==30)
    then
       $s.setAge(40);
       update($s)
       System.out.println("触发demo4_update_3:年龄等于"+$s.getAge());
end

rule "demo4_update_4"
    when
       $s:Student(age==40)
    then
       $s.setAge(50);
       update($s)
       System.out.println("触发demo4_update_4:年龄等于"+$s.getAge());
end

测试类

@Test
public void test1(){
    KieServices kieServices = KieServices.Factory.get();
    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
    //会话对象,用于和规则引擎交互
    KieSession kieSession = kieClasspathContainer.newKieSession();

    Student student= Student.builder().age(10).build();
    kieSession.insert(student);

    //激活规则引擎,如果规则匹配成功则执行规则(匹配规则名以demo4_update开始的)
    kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_update"));

    System.out.println(student);
    //关闭会话
    kieSession.dispose();
}

测试结果

触发demo4_update_1:年龄等于20
触发demo4_update_2:年龄等于30
触发demo4_update_3:年龄等于40
触发demo4_update_4:年龄等于50
Student(name=null, result=null, age=50, sex=null, subjects=null)
 

通过控制台的输出可以看到规则文件中定义的三个规则都触发了。

在更新数据时需要注意防止发生死循环。

3,insert方法

insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。

创建规则文件:

package rules;
import  com.dream21th.drools.study.demo4.Student;

rule "demo4_insert_1"
    when
       $s:Student( age==10)
    then
       Student student=Student.builder().age(20).build();
       insert(student);  //往工作内存中插入一个对象
       System.out.println("触发demo4_insert_1:年龄等于"+$s.getAge());
end

rule "demo4_insert_2"
    when
       $s:Student(age==20)
    then
       $s.setAge(30);
       update($s)
       System.out.println("触发demo4_insert_2:年龄等于"+$s.getAge());
end

rule "demo4_insert_3"
    when
       $s:Student(age==30)
    then
       $s.setAge(40);
       update($s)
       System.out.println("触发demo4_insert_3:年龄等于"+$s.getAge());
end

rule "demo4_insert_4"
    when
       $s:Student(age==40)
    then
       $s.setAge(50);
       update($s)
       System.out.println("触发demo4_insert_4:年龄等于"+$s.getAge());
end

创建测试类

@Test
public void test2(){
    KieServices kieServices = KieServices.Factory.get();
    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
    //会话对象,用于和规则引擎交互
    KieSession kieSession = kieClasspathContainer.newKieSession();

    Student student= Student.builder().age(10).build();
    kieSession.insert(student);

    //激活规则引擎,如果规则匹配成功则执行规则
    kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_insert"));

    System.out.println(student);
    //关闭会话
    kieSession.dispose();
}

测试结果

触发demo4_insert_1:年龄等于10
触发demo4_insert_2:年龄等于30
触发demo4_insert_3:年龄等于40
触发demo4_insert_4:年龄等于50
Student(name=null, result=null, age=10, sex=null, subjects=null)
 

通过控制台输出可以发现,四个规则都触发了,这是因为首先进行规则匹配时只有第一个规则可以匹配成功,但是在第一个规则中向工作内存中插入了一个数据导致重新进行规则匹配,此时第二个规则可以匹配成功。在第二个规则中进行了数据修改导致第三个规则也可以匹配成功,以此类推最终四个规则都匹配成功并执行了。

4,retract方法

retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。

创建规则文件

package rules;
import  com.dream21th.drools.study.demo4.Student;

rule "demo4_retract_1"
    when
       $s:Student( age==10)
    then
       retract($s)
       System.out.println("触发demo4_retract_1:年龄等于"+$s.getAge());
end

rule "demo4_retract_2"
    when
       $s:Student(age==10)
    then
       $s.setAge(30);
       update($s)
       System.out.println("触发demo4_retract_2:年龄等于"+$s.getAge());
end

rule "demo4_retract_3"
    when
       $s:Student(age==30)
    then
       $s.setAge(40);
       update($s)
       System.out.println("触发demo4_retract_3:年龄等于"+$s.getAge());
end

rule "demo4_retract_4"
    when
       $s:Student(age==40)
    then
       $s.setAge(50);
       update($s)
       System.out.println("触发demo4_retract_4:年龄等于"+$s.getAge());
end

创建测试类

@Test
public void test3(){
    KieServices kieServices = KieServices.Factory.get();
    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
    //会话对象,用于和规则引擎交互
    KieSession kieSession = kieClasspathContainer.newKieSession();

    Student student= Student.builder().age(10).build();
    kieSession.insert(student);

    //激活规则引擎,如果规则匹配成功则执行规则
    kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("demo4_retract"));

    System.out.println(student);
    //关闭会话
    kieSession.dispose();
}

测试结果

触发demo4_retract_1:年龄等于10
Student(name=null, result=null, age=10, sex=null, subjects=null)

只触发第一条规则,这是因为工作内存中的student对象被删去的缘故

 

代码地址: https://gitee.com/dream21th/drools-study/tree/master/demo4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dream21st

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值