2012-05-31 16 views
8

Sto avviando un progetto con Drools e Drools Guvnor.Drools disabilita una regola in fase di esecuzione

Le mie regole sono implementate in drools guvnor. La mia istanza del motore delle regole può accedere a tali regole tramite il file pkg esposto da Drools Guvnor quando si esegue il rilascio e la versione di un pacchetto.

Questo funziona correttamente, quello che sto cercando è una soluzione per disabilitare una regola in fase di esecuzione.

L'unica soluzione che ho adesso è quella di andare su guvnor, archiviare la regola e fare una build + release del pacchetto contenente quella regola.

Non c'è un'altra strategia?

risposta

5

Ci sono alcuni modi di risolvere questo, a seconda dei requisiti e l'architettura.

  • Un modo è quello di definire ogni sottoinsieme delle regole in diversi pacchetti Guvnor. Quando costruisci il tuo kbase, puoi caricare solo i pacchetti con le regole che desideri per quel kbase in particolare.

  • Un altro modo è caricare sempre tutte le regole, ma utilizzare un'espressione "abilitata" abilitare/disabilitare le regole in modo dinamico. Si noti che le regole in questo caso sono ancora valutate, ma è possibile impedirne l'attivazione. Questa è una tecnica utile per i casi in cui si desidera abilitare/disabilitare le regole in base ai fatti che si inseriscono nella sessione. Ad esempio:

    regola X abilitato() poi ...

    L'espressione booleana ha accesso alle associazioni variabile dalla condizione di vostra regola, così come gli attributi di regola, le annotazioni di cui sopra e, ovviamente, si può accedere anche ai metodi statici nelle classi helper se si desidera definire le condizioni per attivare la regola esterna al file DRL.

  • Un terzo modo è quello di utilizzare i filtri dell'agenda per il giorno. In questo caso si caricano tutte le regole, si crea la sessione con i fatti e quando si eseguono le regole si utilizza un filtro agenda. Un filtro agenda è un'interfaccia che è possibile implementare o è possibile utilizzare alcuni dei filtri forniti con Drools. Il filtro viene chiamato prima di ogni regola e può quindi porre il veto o consentire al motore di eseguire la regola. Nota che in questo caso tutte le regole sono valutate e attivate, ma solo le regole che il filtro permette di sparare saranno sparate. Ad esempio, se vuoi attivare solo le regole che hanno un nome che inizia con "X", puoi usare la seguente riga di codice:

    ksession.fireAllRules (new RuleNameStartsWithAgendaFilter ("x"));

    Per maggiori informazioni, qui è l'interfaccia:

    https://github.com/droolsjbpm/droolsjbpm-knowledge/blob/master/knowledge-api/src/main/java/org/drools/runtime/rule/AgendaFilter.java

    Ecco la documentazione (Scorrere verso il basso per argomento 3.3.3.4.1):

    http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/index.html#d0e2792

+0

Grazie, in realtà ho provato il secondo modo che hai proposto come spiegato su questo post del blog: http://fusionspan.blogspot.com/2012/02/jboss-drools-disabling -certain-rules.html. Ha funzionato correttamente quando le mie regole sono state caricate dal file system, ma non quando la regola è stata implementata in Guvnor. In questo caso ho avuto un NPE: java.lang.NullPointerException a org.drools.base.mvel.MVELCompilationUnit.createFactory (MVELCompilationUnit.java:262) a org.drools.base.mvel.MVELCompilationUnit.getFactory (MVELCompilationUnit .java: 276) –

+0

Questo è un bug. Dovrebbe funzionare lo stesso, non importa da dove viene caricato. Sarebbe fantastico se tu possa aprire un ticket con il tuo problema in modo che possa essere riparato. –

+0

Bug creato in jboss issue tracker: https://issues.jboss.org/browse/GUVNOR-1904 –

0

È possibile aggiungere condizioni all'esistenza di alcuni fatti nella memoria di lavoro. Qualcosa di simile:

rule "RuleA" 
when 
    not(RuleADisabled()) 
    .... 
then 
    .... 
end 

e disattivare la regola in codice Java:

ksession.insert(new RuleADisabled()); 
+0

Grazie , ma questo significa che per ogni nuova regola devo creare un nuovo tipo di fatto RuleNameDisabled. Ogni volta che eseguirò le mie regole dovrò prima inserire i fatti della regola disabilitata. –

+0

È possibile creare solo un tipo di fatto, ad es. RuleDisabled con attributo ruleName o più regole può dipendere dallo stesso fatto, ad es. not (RuleDisabled (group == "groupX")) –

Problemi correlati