2012-05-31 19 views
8

Estoy comenzando un proyecto con Drools y Drools Guvnor.Drools desactiva una regla en el tiempo de ejecución

Mis reglas se implementan en drools guvnor. Mi instancia de motor de reglas puede acceder a esas reglas a través del archivo pkg expuesto por drools Guvnor cuando se realiza una versión y lanzamiento de un paquete.

Todo funciona bien, lo que estoy buscando es una solución para deshabilitar una regla en tiempo de ejecución.

La única solución que tengo ahora es ir a guvnor, archivar la regla y hacer una versión build + del paquete que contiene esa regla.

¿No hay otra estrategia?

Respuesta

5

Hay algunas maneras de resolver esto, dependiendo de sus necesidades y de la arquitectura.

  • Una forma es definir cada subconjunto de reglas en diferentes paquetes Guvnor. Al construir su kbase, puede cargar solo los paquetes con las reglas que desea para esa kbase en particular.

  • Otra forma de es cargar siempre todas las reglas, pero use una expresión "habilitada" para habilitar/deshabilitar dinámicamente las reglas. Tenga en cuenta que las reglas en este caso todavía se evalúan, pero se puede evitar que se activen. Esta es una técnica útil para casos en los que desea habilitar/deshabilitar reglas en función de los hechos que inserta en su sesión. Por ejemplo:

    regla X permitido() continuación ...

    La expresión booleana anterior tiene acceso a las asignaciones de las variables de la condición de la regla, así como los atributos de la regla, las anotaciones y, obviamente, se puede también acceda a métodos estáticos en clases auxiliares si desea definir las condiciones para activar la regla externa al archivo DRL.

  • Una tercera forma de hacerlo es mediante el uso de filtros de agenda. En este caso, carga todas sus reglas, crea la sesión con los hechos y al ejecutar las reglas utiliza un filtro de agenda. Un filtro de agenda es una interfaz que puede implementar usted mismo o puede usar algunos de los filtros que se incluyen con Drools. El filtro se llama antes de disparar cada regla y luego puede vetar o permitir que el motor ejecute la regla. Tenga en cuenta que en este caso todas las reglas se evalúan y activan, pero solo se dispararán las reglas que el filtro permite disparar. Por ejemplo, si desea activar solo las reglas que tienen un nombre que comienza con "X", puede usar la siguiente línea de código:

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

    Para obtener más información, aquí es la interfaz:

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

    Aquí está la documentación (Vaya a tema 3.3.3.4.1):

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

+0

Gracias, en realidad probé la segunda forma en que propusiste como explicado en esta publicación del blog: http://fusionspan.blogspot.com/2012/02/jboss-drools-disabling -certain-rules.html. Funcionó bien cuando mis reglas se cargaron desde el sistema de archivos, pero no cuando la regla se implementó en Guvnor. En ese caso, yo tenía un NPE: java.lang.NullPointerException en org.drools.base.mvel.MVELCompilationUnit.createFactory (MVELCompilationUnit.java:262) en org.drools.base.mvel.MVELCompilationUnit.getFactory (MVELCompilationUnit .java: 276) –

+0

Eso es un error. Debería funcionar igual, sin importar desde dónde se carga. Sería genial si puede abrir un ticket con su problema para que pueda ser reparado. –

+0

Error creado en el rastreador de problemas de jboss: https://issues.jboss.org/browse/GUVNOR-1904 –

0

Puede agregar la condición a la existencia de algún hecho en la memoria de trabajo. Algo así como:

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

y desactivar la regla en el código de Java:

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

Gracias , pero esto significa que para cada regla nueva tengo que crear un nuevo tipo de hecho RuleNameDisabled. Cada vez que ejecute mis reglas, primero tendré que insertar las reglas deshabilitadas. –

+0

Puede crear solo un tipo de hecho, p. RuleDisabled con attribute ruleName o varias reglas pueden depender del mismo hecho, p. not (RuleDisabled (group == "groupX")) –

Cuestiones relacionadas