2010-12-11 5 views
5

En général, j'écris des règles pour des événements qui égalent (par des valeurs d'attributs) des événements qui peuvent se produire n'importe quand de manière consécutive (toutes les secondes). Je veux tirer des règles pour les événements correspondants uniquement sur une base horaire.Drools - Evénements répétés et relations temporelles

En plus de détails: Je souhaite déclencher une règle lorsqu'un événement est inséré pour la première fois (n'existe pas encore) OU lorsqu'un événement est inséré et si et seulement si des événements égaux sont déjà insérés dans la mémoire de travail MAIS le plus récent d'entre eux est vieux d'au moins une heure. Quelle est une façon raisonnable d'écrire une règle de ce genre, en prenant la durée des événements sera 24H?

Répondre

0

Vous pouvez créer une file d'attente globale comme ceci:

global java.util.List eventQueue; 

Votre besoin d'accéder à la file d'attente globale de java, donc il suffit d'utiliser:

session.getGlobals(); 
session.setGlobal(name, value); 

Dans cette file d'attente d'enregistrer un événement et lié temps. Vérifiez ensuite le code horaire java de cette file d'attente et exécutez les règles en fonction de l'horodatage. Ce n'est pas une mauvaise approche bave, mais c'est simple.

1
rule X 
when 
    $e : MyEvent() from entry-point "s" 
    not(MyEvent(this != $e, id == $e.id, this before[0s,1h] $e) from entry-point "s") 
then 
    // $e arrived and there is no other event with the same 
    // id that happened during the last hour 
end 

Remplacer « id == e.id de $ » par tous les contraintes que vous utilisez pour décider deux événements sont liés les uns aux autres.