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

insert(new Something());

调用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操作的规则,然后执行结果检测。

相关技术视频

QQ技术交流2群:715840230

CSDN学院:《Drools7规则引擎进阶教程》

CSDN学院:《Drools7规则引擎入门教程》

CSDN学院:《Drools7系列优惠套餐》

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注