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 都可以
其他深入的解答下面问题,待后面真实工作开发后,给大家分析总结。

浙公网安备 33010602011771号