2011-02-03 32 views
9

En la aplicación en la que estoy trabajando ahora, 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í tiene la siguiente forma, solo que más grande: Decision diagramÁrboles de decisión y motores de reglas (Drools)

En cada uno de los nodos finales (círculos), necesito ejecutar una acción (cambiar el campo de un objeto, registrar información, etc.). Intenté usar el framework Drool Expert, pero en ese caso necesitaría escribir una regla larga para cada ruta en el diagrama que conduce a un nodo final. Drools Flow no parece estar construido para un caso de uso así: tomo un objeto y luego, dependiendo de las decisiones a lo largo del camino, termino en uno de los nodos finales; y luego otra vez para otro objeto. ¿O es eso? ¿Podría darme algunos ejemplos/enlaces a tales soluciones?

ACTUALIZACIÓN:

Drools flujo de llamadas podría tener este aspecto:

// 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: Me gustaría tener un objeto aplicación, inicie un nuevo proceso para que, cuando se termine el proceso de (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 la aplicación. ¿Qué piensas de esta solución?

SOLUCIÓN:
he terminado usando Drools de flujo y se ha trabajado bastante bien. Mi proceso de decisión no es tan sencillo como pide Drools Expert y dependiendo de en qué parte del árbol de decisiones está el proceso, necesita cargar listas de objetos de la base de datos, transformarlas, tomar decisiones, registrar todo, etc. Uso un objeto Process eso se pasa al proceso como un 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 (ya que escribir código Java en los nodos Script Task no es muy conveniente). 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 usan como variables Java normales en el código.

Respuesta

12

Drools expert es definitivamente el camino a seguir.

Si se quiere evitar repetir siempre lo mismo para los nodos más altos, entonces el truco es usar insertLogical (o simplemente insert si estás en una sesión sin estado) y entender que las reglas pueden desencadenar reglas (No es SQL de su padre consulta). 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 a editarlo), echar un vistazo a la documentación sobre las tablas de decisión (y DSL). En ese caso, probablemente repita la ruta completa de cada regla, pero eso está bien en la mayoría de los casos.

+0

Además, a medida que crece su árbol de decisiones, puede descubrir que algunos nodos finales comparten acciones (por ejemplo, todas las jubiladas necesitan una pensión, independientemente de su género) y es ineficaz volver a declarar esa acción por nodo final. –

+0

¿Qué pasa con Drools Flow? Puedo modelar el árbol de decisiones usando eso y luego puedo poner un objeto en la Memoria de Trabajo, iniciar el proceso y dejar que decida qué nodo final tomar, luego sacar el objeto, poner otro, iniciarlo de nuevo y así sucesivamente ? ¿No es esa una solución más clara? –

+0

Drools Flow no tiene sentido. No dice que no podría funcionar, pero ya que está tomando una decisión, una tabla de decisiones implementada con un motor de reglas se siente mucho más lógica/natural. Intentar encajarlo en un flujo de trabajo es extraño: un flujo de trabajo es de larga vida, cada nodo es un estado. –

-1

Puede probar el motor de reglas cum de iLog framework.

+1

Gracias, pero iLog parece innecesariamente complicado. Estoy buscando una solución más simple. –

+0

¿Qué tal Java Rules Engine API basado en JSR 94? También hay uno llamado Jess. Puede encontrar una lista en este enlace: http://java-source.net/open-source/rule-engines – Sid

+2

Aquí tendrá los mismos problemas de diseño. Cambiar la implementación del motor de reglas no ayudará. Drools implementa JSR-94, pero la API JSR-94 está demasiado confinada para la mayoría de los casos de uso real. No ha evolucionado en años. –

0

Tuve un problema similar y usé la base de datos de nodos 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 para los usuarios finales).

Cuestiones relacionadas