2013-04-23 49 views
0

我是新来的流口水,请帮我理解,如果我更新对象后,我打电话给所有规则,它会触发规则,因为它在drools文件?Drools java更新

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 

如果它不火,不流口水发动机保持味精作为完全不同的会话对象从Java运行时对象,因此其旗下不受影响。如果它不是背后的概念,请帮助我理解

感谢 琳

回答

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 

希望它能帮助,

+0

嘿感谢。我发现updatelisteners存在可用于通过java代码更新任何事实(对象)时触发规则但找不到任何示例的代码 请分享一个示例如果有的话 谢谢Chakri – Chakri 2013-05-04 11:36:53

+0

谢谢,这非常有帮助。 – ProfVersaggi 2013-11-25 21:42:47