2011-01-14 21 views
6

Sto provando a scrivere una regola che ritarda il licenziamento fino a quando sono trascorsi almeno 15 minuti dall'ultimo sparo. Tuttavia, gli operatori temporali in Drools Fusion consentono solo il ragionamento su due eventi in relazione tra loro e non su un evento in relazione al tempo corrente.Drools Fusion ha un concetto di "adesso"?

Vorrei qualcosa di simile:

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

Mi hanno fatto ricorso a scrivere una regola che spara ogni secondo e inserisce un evento heartbeat (ritraendo anche il battito cardiaco precedente), che posso utilizzare in altre regole per servire come l'ora corrente.

Trovo che questo sia poco elegante; mi manca qualcosa o Drools Fusion non ha davvero qualcosa per questo?

NB. Sono non alla ricerca di spari ritardati di regole o regole che possono sparare solo su multipli di 15 minuti; se non è successo nulla negli ultimi 17 minuti, la regola deve corrispondere a immediatamente in risposta a un nuovo evento.

risposta

8

Sebbene il concetto di "ORA" possa sembrare inizialmente semplice, non è, poiché è ambiguo e dipende dalla diversa semantica che può assumere in base all'ambiente di esecuzione. Drools Fusion ha un concetto di "ORA" quando lo si esegue in modalità STREAM, ma è diverso da quello che si sta chiedendo in precedenza. La spiegazione è un po 'lunga da fare qui, quindi concentrati sul tuo problema.

In primo luogo, si dice: "Sto cercando di scrivere una regola che ritarda il licenziamento ..." e poi la tua affermazione: "Non sto cercando un licenziamento ritardato delle regole ...", quindi sono confuso riguardo quello che ti serve.

Se si vuole ritardare la regola è possibile utilizzare l'attributo temporizzatore:

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

Se si vuole sparare una regola nel caso in cui un evento ha o non è accaduto all'interno di un intervallo, è possibile utilizzare le finestre scorrevoli . Es .:

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

Spero che questo aiuti. E a proposito, prova a postare le tue domande sulla mailing list di Drools in quanto sarà più facile per te ottenere una risposta. Ho visto il tuo post solo perché un amico mi ha fatto un commento.

Cheers, Edson

+0

Il tuo commento che 'la società' è un concetto problematico è intrigante. Puoi elaborare? –