2011-02-03 12 views
9

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: Decision diagramAlberi 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.

risposta

12

Drools esperto è sicuramente il modo di andare.

Se si vuole evitare di ripetere se stessi per i nodi più alti, quindi il trucco è quello di utilizzare insertLogical (o solo insert se siete in una sessione stateless) e per capire che le regole possono scatenare regole (non è SQL di tuo padre query). Per esempio:

// 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 

Se lo schema di decisione cambia frequentemente (e si desidera non programmatori di modificarlo), date un'occhiata alla documentazione su tabelle decisionali (e DSL). In questo caso probabilmente ripeterai l'intero percorso per ogni regola, ma in realtà è ok nella maggior parte dei casi.

+0

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. –

+0

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? –

+0

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. –

-1

È possibile provare il motore di regole cum di iLog framework.

+1

Grazie, ma iLog sembra inutilmente complicato. Sto cercando una soluzione più snella. –

+0

Informazioni sull'API Java Rules Engine basato su JSR 94? C'è anche uno chiamato Jess. Puoi trovare un elenco a questo link: http://java-source.net/open-source/rule-engines – Sid

+2

Avrai gli stessi problemi di progettazione. Cambiare l'implementazione del motore di regole non sarà di aiuto. Drools implementa JSR-94, ma l'API JSR-94 è troppo limitata per la maggior parte dei casi reali. Non si è evoluto da anni. –

0

Ho avuto un problema simile e ho utilizzato il database del nodo Neo4J come un motore di regole semplice e molto flessibile. Si può usare con un'interfaccia di servizio REST in modo che sia indipendente dall'applicazione principale. Puoi anche avere un'applicazione separata per configurare le regole (anche da parte degli utenti finali).