Drools入门学习总结

Drools学习总结

Drools知识归纳:https://www.cnblogs.com/ffaiss/p/10995891.html

 

1、  Drools的执行过程:定义-》创建-》编译-》执行-》销毁

 

2、  Drools简单实用例子:

 

针对 简单数据:

package com.winner.test
rule "droolsRule1"
    when
       
$num:Integer();
        eval($num == 2);
    then
       
System.out.println( "my first drools rule");
end

 

java执行代码:

@Test
public void test(){
    // load up the knowledge base
    KieServices ks = KieServices.Factory.get();
    KieContainer kContainer = ks.getKieClasspathContainer();
    KieSession kSession = kContainer.newKieSession("ksession-rules");

    // go !
    kSession.insert(2);
    kSession.fireAllRules();//执行规则
    kSession.dispose();

}

 

 

针对java对象:

Java对象:

public class User
{

    private String name;
    private Integer age;

get/set方法略

 

 

package winner.object
import com.winner.controller.test.User

rule "user1"
    when
       
$user:User(name=="zhangsan");
    then
       
System.out.println( "Object is zhangsan");
end

rule
"user2"
    when
       
$user:User(name=="lisi");
    then
       
System.out.println( "Object is lisi");
end

 

 

执行代码:

@Test
public void testObj(){
    // load up the knowledge base
    KieServices ks = KieServices.Factory.get();
    KieContainer kContainer = ks.getKieClasspathContainer();
    KieSession kSession = kContainer.newKieSession("ksession-rules");
    User user = new User("zhangsan",1);
    // go !
    kSession.insert(user);
    int count = kSession.fireAllRules();//执行规则
    System.out.println(">>>>>>>>>test finish<<<<<<<<<<<");
    System.out.println("第一次执行命中了" + count + "条规则!");
    kSession.dispose();
}

 

3、  有关Drools函数的使用:

3.1、简单使用insert使insert执行死循环(java执行代码跟上面一致):

规则:

rule "user1"
    when
       
$user:User(name=="zhangsan");
    then
        insert
($user);//$user未改变 insert并没有从新加载rule
        System.out.println( "Object is zhangsan");
end

 

执行之后,没有死循环。

 

rule "user1"
    when
       
$user:User(name=="zhangsan");
    then
       
$user.setAge(20);
        insert($user);//$user改变 insert从新加载rule
        System.out.println( "Object is zhangsan");
end

执行第一遍命中之后,修改了年龄,会再次执行第二遍命中,由于数据还是20,执行2次后,完毕。

 

rule "user1"
    when
       
$user:User(name=="zhangsan");
    then
       
User user = new User("zhangsan",32);
        insert(user);//$user改变 insert从新加载rule
        System.out.println( "Object is zhangsan");
end

这里跟上面的不一样,这里在then后面直接new 了一个Java对象,导致每次都insert新的对象,程序陷入死循环,不仅如此,Drools中的update,retract,insert,getRule等方法都会执行类型的从新加载。

3.2、如何解决死循环问题:

 

rule "user1"
    no-loop true //lock-on-active 也可以
    when
       
$user:User(name=="zhangsan");
    then
       
User user = new User("zhangsan",32);
        insert(user);//$user改变 insert从新加载rule
        System.out.println( "Object is zhangsan");
end

 

在rule加一个 no-loop true属性或者lock-on-active 都可以

 

其他深入的解答下面问题,待后面真实工作开发后,给大家分析总结。

posted @ 2020-05-19 15:07  翌翔  阅读(474)  评论(0)    收藏  举报