Notification au moteur de règles des changements d'objet

Vous pouvez notifier au moteur de règles la disponibilité de nouveaux objets ou les cas où un objet a été mise à jour ou retiré.

A propos de cette tâche

La notification des changements d'objets dépend du mode d'exécution :

  • Lorsque le moteur de règles fonctionne en mode RetePlus, il recalcule instantanément les règles concordantes et reprogramme un agenda interne.
  • Lorsque le moteur de règles fonctionne en mode séquentiel ou Fastpath, il ne prend en compte le nouveau statut des objets que lorsque vous entrez une nouvelle tâche de règle.

Procédure

  1. Utilisez la structure de phrase de code suivante: insert object;

    Cette instruction notifie à l'algorithme RetePlus qu'un nouvel objet est disponible. Les règles qui dépendent de ce genre d'objets sont exécutées lorsque les objets remplissent leurs conditions.

  2. Utilisez la structure de code suivante: insert ClassName(<constructor_arguments>) [{statement1; ... statement}] ;
  3. Si le moteur de règles s'exécute en mode RetePlus , utilisez la structure de phrase de code suivante: update object;

    Cette instruction notifie à l'algorithme RetePlus que les règles qui dépendent de cet objet doivent être réévaluées. Certaines de ces règles cessent de s'exécuter tandis que d'autres commencent à s'exécuter.

  4. Si le moteur de règles s'exécute en mode RetePlus , utilisez la structure de phrase de code suivante: retract object;

    Cette instruction notifie à l'algorithme RetePlus que cet objet n'est plus disponible. Les règles tributaires de cet objet ne sont plus exécutées.

Résultats

Le code suivant présente le schéma global de notification des changements d'objets au moteur de règles :

insert object;
insert ClassName(<constructor_arguments>) 
   [{statement1; ... statement}] ;
   update object;
   retract object;

Exemple

Dans la partie then de cet exemple, l'algorithme RetePlus est informé que le nouvel objet penalty est disponible et que l'objet account n'est plus disponible. Des règles peuvent donc s'exécuter pour les objets penalty, mais plus pour les objets account. Dans la partie else, l'algorithme RetePlus est informé que les règles tributaires de l'objet account doivent être réévaluées. Par conséquent, certaines de ces règles cessent de s'exécuter tandis que d'autres commencent à s'exécuter.

rule financial.rules.CheckBalance {
   when {
     account: Account();
     evaluate (account.getBalance() < 0 );
   }
   then { // compute a penalty
      Penalty penalty = new Penalty(account);
      insert penalty;
      retract account;
   }
   else { // compute a bonus
      account.computeBonus();
      update account; 
   }
};