流口水java更新

Cha*_*kri 0 java drools

我是新来的流口水,请帮助我了解,如果我更新对象后,我打电话火的所有规则,将其启动时机的规则,因为它在Drools的文件呢?

喜欢

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
Run Code Online (Sandbox Code Playgroud)

而在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
Run Code Online (Sandbox Code Playgroud)

如果它没有触发,那么drool引擎会将一个msg作为与Java运行时对象完全不同的会话对象,因此它不受影响.如果它不是背后的概念,请帮助我理解

谢谢Chakri

Est*_*rti 5

规则不会对您的更改做出反应.Drools不会保留对象的不同"副本",它只是不会评估规则.如果您想让drools知道您的修改,您必须使用sessionObject.update().然后不要再忘记fireAllRules()了.您的代码应该与此类似:

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
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你,