2013-04-23 50 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