2011-01-14 14 views
6

Ich versuche eine Regel zu schreiben, die das Schießen verzögert, bis mindestens 15 Minuten seit dem letzten Schießen verstrichen sind. Die temporalen Operatoren in Drools Fusion erlauben jedoch nur das Schließen zweier Ereignisse in Bezug aufeinander und nicht eines Ereignisses in Bezug auf die aktuelle Zeit.Hat Drools Fusion ein Konzept von "jetzt"?

Ich würde so etwas wie dies mag:

rule "some rule" 
when 
    not LastFiredEvent(this before[0m, 15m] NOW) 
    … 

Ich habe Zuflucht, eine Regel zu schreiben, die jede Sekunde und fügt ein Herzschlag-Ereignis ausgelöst (auch die vorherigen Herzschlag Einfahren), die ich in anderen Regeln verwenden dienen als die aktuelle Zeit.

Ich finde das ziemlich unelegant; Fehle ich etwas oder hat Drools Fusion wirklich nichts dafür?

NB. Ich bin nicht auf der Suche nach verzögerten Feuern von Regeln oder Regeln, die nur auf ein Vielfaches von 15 Minuten feuern kann; Wenn in den letzten 17 Minuten nichts passiert ist, muss die Regel sofort als Reaktion auf ein neues Ereignis ausgelöst werden ().

Antwort

8

Obwohl das Konzept von "NOW" am Anfang einfach erscheinen mag, ist es nicht, wie es mehrdeutig ist und abhängig von der verschiedenen Semantik, die es basierend auf der laufenden Umgebung dauern kann. Drools Fusion hat ein Konzept von "NOW" , wenn Sie es in STREAM-Modus ausführen, aber es unterscheidet sich von dem, was Sie oben fragen. Die Erklärung ist hier ein wenig zu lang, also konzentrieren wir uns auf Ihr Problem.

Zuerst sagst du: "Ich versuche eine Regel zu schreiben, die das Feuern verzögert ..." und dann sagst du: "Ich suche kein verzögertes Abfeuern von Regeln ...", also bin ich verwirrt was du brauchst.

Wenn Sie die Regel verzögern wollen Sie das Timer-Attribut verwenden:

rule X 
    timer(int: 15m) 
... 

Wenn Sie ein Ereignis, eine Regel für den Fall feuern wollen oder nicht innerhalb eines Intervalls passieren hat, können Sie Schiebefenster verwenden . Zum Beispiel:

rule "Event did not happen in the last 15m" 
when 
    not(SomeEvent() over time:window(15m)) 
... 

Hoffe, dass hilft. Und BTW, versuchen Sie, Ihre Fragen in der Drools Mailingliste zu veröffentlichen, da es einfacher für Sie ist, eine Antwort zu bekommen. Ich habe deinen Post nur gesehen, weil ein Freund mich darum gebeten hat.

Cheers, Edson

+0

Ihr Kommentar, dass 'jetzt' ein problematischer Begriff faszinierend ist. Kannst du es ausarbeiten? –