Nell'applicazione a cui sto lavorando in questo momento, ho bisogno di verificare periodicamente l'idoneità di decine di migliaia di oggetti per qualche tipo di servizio. Il diagramma decisionale stesso è nella seguente forma, semplicemente più grande: Alberi decisionali e motori di regole (Drools)
In ciascuno dei nodi finali (cerchi), ho bisogno di eseguire un'azione (cambiare il campo di un oggetto, registrare le informazioni, ecc.). Ho provato a utilizzare Drool Expert framework, ma in tal caso avrei bisogno di scrivere una regola lunga per ogni percorso nel diagramma che porta a un nodo finale. Drools Flow non sembra essere costruito per un simile caso d'uso - prendo un oggetto e poi, a seconda delle decisioni lungo la strada, finisco in uno dei nodi finali; e poi di nuovo per un altro oggetto. O è? Potresti darmi qualche esempio/link a tali soluzioni?
UPDATE:
Drools flusso chiama potrebbe essere simile a questo:
// 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);
}
Cioè: mi piacerebbe prendere un oggetto Application, avviare un nuovo processo per esso, quando il processo è finito (l'ultimo nodo azione modificherà l'applicazione in qualche modo), rimuoverò l'oggetto dalla memoria di lavoro e ripeterò il processo per un nuovo oggetto App. Cosa ne pensi di questa soluzione?
SOLUZIONE:
ho finito per usare Drools flusso ed ha lavorato abbastanza bene. Il mio processo decisionale non è così semplice come richiesto da Drools Expert e, a seconda di dove nell'albero delle decisioni si trova il processo, è necessario caricare liste di oggetti dal database, trasformarle, prendere decisioni, registrare tutto ecc. Uso un oggetto Process viene passato al processo come parametro e memorizza tutte le mie variabili globali (per il processo) e alcuni metodi di convenienza che vengono ripetuti in diversi punti dell'albero (poiché scrivere codice Java nei nodi Script Task
non è molto conveniente). Ho anche finito di usare Java per prendere decisioni (e non mvel
o regole) - è più veloce e direi più facile da controllare. Tutti gli oggetti con cui lavoro sono passati come parametri e usati come normali variabili Java nel codice.
Inoltre, man mano che il tuo albero decisionale cresce, potresti scoprire che alcuni nodi finali condividono azioni (per esempio tutte le necessità dei pensionati di ottenere una pensione, irrilevanti del loro genere) ed è inefficiente a ripetere l'azione per nodo finale. –
Che ne pensi di Drools Flow? Posso modellare l'albero delle decisioni usando quello e quindi potrei mettere un oggetto nella memoria di lavoro, avviare il processo e lasciare decidere quale nodo finale prendere, quindi estrarre l'oggetto, inserirne un altro, avviarlo di nuovo e così via ? Non è una soluzione più chiara? –
Drools Flow non ha senso. Non dicendo che non potrebbe funzionare, ma dal momento che stai prendendo una decisione, una tabella delle decisioni implementata con un motore di regole sembra molto più logico/naturale. Cercare di adattarlo a un flusso di lavoro è strano: un flusso di lavoro è longevo, ogni nodo è uno stato. –