2010-12-11 13 views
5

In generale, sto scrivendo regole per eventi che possono uguagliare (per valori di attributi) eventi in modo consecutivo (ogni secondo). Voglio attivare le regole per gli eventi corrispondenti solo su basi orarie.Drools - Eventi ripetuti e relazioni temporali

In ulteriori dettagli: Voglio attivare una regola quando un evento viene inserito per la prima volta (non ancora esistente) O quando un evento è inserito e se e solo se eventi uguali sono già stati inseriti nella memoria di lavoro MA il più recente di loro è almeno un'ora fa.

Qual è un modo ragionevole di scrivere una regola di questo tipo, tenendo gli eventi la durata sarà 24 ore?

risposta

0

Si potrebbe creare una coda globale come questo:

global java.util.List eventQueue; 

vostro anche bisogno di accedere al tuo coda globale da Java, quindi basta usare:

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

In questa coda salvare un evento e relativo tempo. Quindi, controlla la codifica java del codice orario in questa coda ed esegui le regole in base al timestamp. Questo non è un approccio povero, ma è semplice.

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 

sostituire "id == $ e.id" con qualsiasi vincoli si utilizza per decidere due eventi sono collegati gli uni agli altri.