0

我是流口水的新手,请帮助我理解如果我在调用触发所有规则后更新对象,它会像在流口水文件中那样触发规则吗?

喜欢

rule "Hello World"
no-loop true
when
    message:Message (type=='Hello')
then
    modify(message){
        setType("Hi")//Fires other rule below
    }
    message.setMsgtext("Msg: Hello World, Drools");
    System.out.println("Hello World, Drools!");
end

rule "Hi World"
when
    message:Message (type=='Hi')
then
    modify(message){
        setType("Hello")
    }
    System.out.println("Hi World, Drools!");
end

而在 JAVA 代码中,

Message msg = new Message();
msg.setType("Hello");
//sessionObject = rbase.newStatefulSession();
sessionObject.insert(msg);
sessionobject.fireAllrules();
msg.setType("Hi"); //Here can it fire the rule? for me its not doing it

如果它没有触发,Drool 引擎是否将 msg 保留为与 Java 运行时对象完全不同的会话对象,因此它不受影响。如果不是背后的概念,请帮助我理解

谢谢查克里

4

1 回答 1

5

规则不会对您的更改做出反应。Drools 不会保留对象的不同“副本”,它只是不会评估规则。如果你想让口水知道你的修改,你必须使用 sessionObject.update()。然后不要忘记再次触发AllRules()。您的代码应类似于以下内容:

Message msg = new Message();
msg.setType("Hello");
//sessionObject = rbase.newStatefulSession();
FactHandle handle = sessionObject.insert(msg);
sessionobject.fireAllrules();
msg.setType("Hi");
sessionObject.update(handle, msg) // rules are re-evaluated here
session.fireAllRules(); // fire any pre-activated rule

希望能帮助到你,

于 2013-04-24T13:54:35.540 回答