2011-10-13 54 views
0

我正在使用專有的規則引擎,現在我正在嘗試使用Drools,我對Drools很新。如何將規則應用於會話中對象的所有屬性?

使用先前的規則引擎,即使它們是其他對象的屬性,也會爲現有對象的所有實例觸發規則。

我有一套適用於給定類型的對象O的規則。我添加到我的會話和對象O'具有O作爲屬性。但是由於規則不適用於O',它們不會應用於O'的屬性O.

我將與一個HELLO字例子說明這一點:

我添加到基本流口水實施例下面的類:

public static class Email { 

     private Message message ; 


     public void setMessage(Message message) { 
      this.message = message; 
     } 

     public Message getMessage() { 
      return message; 
     } 
} 

電子郵件是O」和消息是O.

我會話「作品」如下:

  ... 
      Message message = new Message(); 
      message.setMessage("Hello World"); 
      message.setStatus(Message.HELLO); 
      Email email = new Email(); 
      email.setMessage(message); 
      ksession.insert(email); 
      ksession.fireAllRules(); 
      logger.close(); 
      ... 

我有一個示例流口水文件:

rule "Hello World" 
    when 
     m : Message(status == Message.HELLO, myMessage : message) 
    then 
     System.out.println(myMessage); 
     m.setMessage("Goodbye cruel world"); 
     m.setStatus(Message.GOODBYE); 
     update(m); 
end 

該規則僅適用於消息。

如果按照它的方式啓動會話,則不會觸發任何規則。 要有規則解僱我需要添加規則:

rule "email" 
    when 
     e : Email(message != null) 
    then 
     insert(e.getMessage()); 
end 

它工作正常,但我的問題是:是否有到對一個對象的每個實例觸發的規則更簡單的方法,即使它的屬性另一個對象?

回答

1

是的,你可以這樣做:

rule "Hello World" 
    when 
     $email: Email(message.status == Message.HELLO, $myMessage: message.message) 

    then 
     System.out.println($myMessage); 
     m.setMessage("Goodbye cruel world"); 
     m.setStatus(Message.GOODBYE); 
     update(m); 
end 

,或者您可以使用規則

Rule "insert message" 
    when 
     Email ($message: message) 
    then 
     insert($message); 
end 

使用這種方法,那麼你可以只寫使用規則只需將消息發送到工作記憶消息類型。

乾杯

+0

thx很多!我會嘗試第一種方法 –

+0

@RickyBobby我可以問一下嗎?我怎樣才能獲得插入'$消息'的Java代碼? – newbie

+0

或者如果可能的話從java中插入規則到對象? – newbie

相關問題