2011-10-13 3 views
0

J'utilisais un moteur de règles propriétaire, et j'essaie maintenant d'utiliser Drools, je suis assez nouveau pour Drools. Avec le moteur de règles précédent, la règle a été déclenchée pour toutes les instances d'objet existant même s'il s'agissait d'un attribut d'un autre objet.Comment appliquer des règles à tous les attributs d'un objet dans la session?

J'ai un ensemble de règles qui sont appliquées à un type donné d'objet O. J'ajoute à ma session et à l'objet O 'ayant O comme attribut. Mais comme les règles ne sont pas appliquées à O ', elles ne seront pas appliquées à l'attribut O de O'.

Je vais illustrer cela par un exemple de mot HELLO:

J'ajouté à la bave de base Exemple la classe suivante:

public static class Email { 

     private Message message ; 


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

     public Message getMessage() { 
      return message; 
     } 
} 

Email est O » et un message est O.

Mon la session "fonctionne" comme suit:

  ... 
      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(); 
      ... 

et j'ai un exemple de fichier de bave:

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 

La règle est uniquement appliquée au message. Si je lance ma session comme elle est, aucune règle ne sera déclenchée. Pour avoir des règles tirées je dois ajouter la règle:

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

Il fonctionne très bien, mais ma question est: est-il un moyen plus facile d'avoir la règle tiré sur chaque instance d'un objet même si elle est un attribut de un autre objet?

Répondre

1

Oui, vous pouvez faire quelque chose comme:

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 

ou vous pouvez simplement insérer le message à la mémoire de travail en utilisant une règle

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

En utilisant cette approche, vous pouvez écrire des règles en utilisant uniquement les Type de message.

Salutations

+0

Merci beaucoup! Je vais essayer la première approche –

+0

@RickyBobby Puis-je demander? Comment puis-je obtenir le '$ message' inséré dans le code java? – newbie

+0

ou si possible obtenir l'objet inséré des règles à Java? – newbie

Questions connexes