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: Á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.
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. –
¿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? –
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. –