Pregunta

En la aplicación en la que estoy trabajando en este momento, necesito verificar periódicamente la elegibilidad de decenas de miles de objetos para algún tipo de servicio. El diagrama de decisión en sí está en la siguiente forma, solo mucho más grande: Decision diagram

En cada uno de los nodos finales (círculos), necesito ejecutar una acción (cambiar el campo de un objeto, información de registro, etc.). Intenté usar el marco de expertos de baba, pero en ese caso necesitaría escribir una regla larga para cada ruta en el diagrama que conduce a un nodo final. El flujo de babeos tampoco parece estar construido para tal caso de uso: tomo un objeto y luego, dependiendo de las decisiones en el camino, termino en uno de los nodos finales; y luego nuevamente para otro objeto. ¿O es eso? ¿Podría darme algunos ejemplos/enlaces a tales soluciones?

ACTUALIZAR:

Las llamadas de flujo de bucle pueden verse así:

// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();

for(int i = 0; i < 10000; i++) {

    Application app = somehowGetAppById(i);

    // insert app into working memory
    FactHandle appHandle = ksession.insert(app);

    // app variable for action nodes
    params.put("app", app);

    // start a new process instance
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
    while(true) {
        if(instance.getState() == instance.STATE_COMPLETED) {
            break;
        }
    }

  // remove object from working memory
    ksession.retract(appHandle);
}

Es decir: tomaría un objeto de aplicación, comenzaría un nuevo proceso para él, cuando el proceso esté terminado (el nodo de acción final modificaría la aplicación de alguna manera), eliminaría el objeto de la memoria de trabajo y repetiría el proceso para un nuevo objeto de aplicación. ¿Qué opinas de esta solución?

SOLUCIÓN:
Terminé usando el flujo de babeos y ha funcionado bastante bien. Mi proceso de decisión no es tan sencillo como solicita el experto en bucle y, dependiendo de en qué parte del árbol de decisión, el proceso es que necesita cargar listas de objetos de la base de datos, transformarlos, tomar decisiones, registrar todo, etc. Utilizo un objeto de proceso que se pasa al proceso como parámetro y almacena todas mis variables globales (para el proceso) y algunos métodos de conveniencia que se repiten en diferentes puntos del árbol (como escribiendo el código Java en el Script Task Los nodos no son muy convenientes). También terminé usando Java para tomar decisiones (y no mvel o reglas): es más rápido y diría que es más fácil de controlar. Todos los objetos con los que trabajo se pasan como parámetros y se utilizan como variables Java normales en el código.

¿Fue útil?

Solución

Experto de babeo Definitivamente es el camino a seguir.

Si quieres evitar repetirte para los nodos superiores, entonces el truco es usar insertLogical (o solo insert Si está en una sesión sin estado) y comprender que las reglas pueden desencadenar reglas (no es la consulta SQL de su padre). Por ejemplo:

// we just insert Customer objects in the WM

rule "evaluateRetired"
when
    $c : Customer(age > 65)
then
    insertLogical(new Retiree($c));
end

rule "evaluteRetireeIsFemale"
when
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer)
then
    ...
end

Si el diagrama de decisión cambia con frecuencia (y desea que los no programadores lo editen), eche un vistazo a la documentación sobre tablas de decisión (y DSL). En ese caso, probablemente repetirá todo el camino para cada regla, pero eso está realmente bien en la mayoría de los casos.

Otros consejos

Tuve un problema similar y usé la base de datos del nodo Neo4J como un motor de reglas simple y muy flexible. Puede usarlo con una interfaz de servicio REST para que sea independiente de la aplicación principal. También puede tener una aplicación separada para configurar las reglas (incluso por los usuarios finales).

Puede probar el motor de reglas CUM de marco ILOG.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top