es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Modo de flujo negativo de patrones de Drools.

Tengo una pregunta sobre el modo de flujo en Drools.
Estoy usando esta regla

declare MetaMessage
        @role(event)
end

<p>rule 'rule1' ruleflow-group 'default'<br>
    when<br>
        $inMess : MetaMessage() from entry-point 'default'
        not(MetaMessage(this != $inMess, this after [0s,10s] $inMess) from entry-point 'default')
    then<br>
        //hacer cosas
end

Si envío un MetaMessage, espero que la regla se ejecute después de los 10 segundos especificados, pero no ocurre nada.
Si envío un nuevo MetaMessage, después de 10 segundos, se ejecuta la regla.

Editar: Si cambio la regla y elimino el “not”, funciona perfectamente.

No estoy seguro de qué estoy haciendo mal.

Así es como creo el KieBase

KieBaseConfiguration config = KieServices.Factory.get().newKieBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KieBase kieBase = kieHelper.build(config);
KieSession kieSession = kieBase.newKieSession();

Editar 2
Ejecuto las reglas usando fireAllRules() cada vez que se inserta un nuevo MetaMessage en una cola de Kafka.
Entonces tengo un consumidor que recopila mensajes e los inserta en la sesión de la siguiente manera

EntryPoint ep = kieSession.getEntryPoint("default");
ep.insert(metaMessage);
kieSession.fireAllRules();

Editar 3
Tengo otra regla simple que se ejecuta junto con la anterior

rule "AccumulatedTest"</p>

<pre><code>when
    accumulate(MetaMessage( timestamp > 0 ); $cnt: count(1))
then
    log.info("Mensaje n: "+$cnt);
</code></pre>

end

La primera vez que se inserta un mensaje (cuando la kieSession es recién creada) obtengo la información “Mensaje n: 0”.
Pero luego esta regla ya no se dispara más.

Si se inserta cualquier otro mensaje en la sesión, la regla no se dispara.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el uso de la palabra clave “not” en la regla. Cuando se utiliza la palabra clave “not”, se especifica que la regla solo se ejecutará si la condición dentro de la declaración “not” no es verdadera. En este caso, la condición está verificando si existe otro MetaMessage que no sea igual al actual, y que haya ocurrido en los últimos 10 segundos.

    Dado que la regla se dispara cada vez que se inserta un nuevo MetaMessage en una cola de Kafka, es posible que no haya otro MetaMessage que cumpla con la condición “not”, lo que podría provocar que la regla no se dispare.

    Una forma de probar esta hipótesis sería insertar un segundo MetaMessage que cumpla con la condición “not” dentro del intervalo de 10 segundos después de que se inserte el primer mensaje, y ver si la regla se dispara entonces.

    Alternativamente, eliminar la palabra clave “not” de la regla y verificar únicamente el MetaMessage actual podría ser una forma de garantizar que la regla se dispare cada vez que se inserte un nuevo mensaje.

    También es posible que el problema esté relacionado con la configuración de la KieBase, específicamente con la opción EventProcessingOption. Dado que la regla se ocupa de eventos, es necesario establecer la opción EventProcessingOption en STREAM para que el motor de reglas procese los eventos en tiempo real.

    Sin más información, es difícil identificar la causa exacta del problema. Sin embargo, podría ser útil verificar la memoria de trabajo de la KieSession y los registros para ver si se generan errores o advertencias.

Comments are closed.