Entscheidungsbäume und rule engines (Drools)
In der Anwendung, ich bin jetzt arbeiten, ich muss in regelmäßigen Abständen überprüfen die Förderfähigkeit von Zehntausenden von Objekten, die irgendeine Art von service. Die Entscheidung Diagramm selbst ist in der folgenden form, nur viel größer:
In jedem der end-Knoten (Kreise), ich muss eine Aktion ausführen (eines Objekts ändern, Feld, log-Informationen etc.). Ich habe versucht mit Spucke Expert framework, aber in diesem Fall würde ich schreiben müssen, eine lange Regel für jeden Pfad in dem Diagramm, was zu einem end-Knoten. Drools Flow nicht zu sein scheinen gebaut für einen solchen Anwendungsfall entweder ich nehme einen Gegenstand und dann, je nach den Entscheidungen auf dem Weg, dass ich am Ende in einem der Endknoten; und dann wieder für ein anderes Objekt. Oder ist es? Könnten Sie mir einige Beispiele/links zu solchen Lösungen?
UPDATE:
Drools Flow-Aufrufe könnten wie folgt Aussehen:
//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);
}
Ist: würde ich nehmen, der ein Application-Objekt, einen neuen Prozess starten, wenn der Prozess beendet ist (das Letzte, action-Knoten ändern Sie die Anwendung irgendwie), würde ich entfernen Sie das Objekt aus dem Arbeitsspeicher aus und wiederholen Sie den Vorgang für ein neues App-Objekt. Was denkst du über diese Lösung?
LÖSUNG:
Ich habe es schließlich mit Drools Flow, und es arbeitet ziemlich gut. Meine Entscheidung ist nicht so einfach, wie Drools Expert fragt nach und je nachdem, wo in der Entscheidungsstruktur der Prozess ist, den es braucht, um zu laden, Listen von Objekten aus der Datenbank, transformieren Sie, Entscheidungen zu treffen, melden Sie alles, etc. Ich benutze ein Prozess-Objekt, das übergeben wird, um den Prozess als parameter und speichert alle meine globalen Variablen (für den Prozess) und ein paar convenience-Methoden, die wiederholt an verschiedenen stellen in der Struktur (wie das schreiben von Java-code in die Script Task
Knoten ist nicht sehr bequem selbst). Ich habe auch am Ende mit Hilfe von Java, um Entscheidungen zu treffen (und nicht mvel
oder Regeln) - es ist schneller-und ich würde sagen, leichter zu kontrollieren. Alle Objekte, die ich mit als Parameter übergeben werden und als normale Java-Variablen im code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drools expert ist definitiv der Weg zu gehen.
Wenn Sie vermeiden möchten, wiederholen sich für den höheren Knoten, dann der trick ist die Verwendung
insertLogical
(oder nurinsert
wenn Sie in einer stateless-session) und zu verstehen, dass die Regeln können trigger-Regeln (Es ist nicht dein Vater SQL-Abfrage). Zum Beispiel:Wenn die Entscheidung-Diagramm Häufig ändert (und Sie wollen nicht-Programmierer, um es zu Bearbeiten), werfen Sie einen Blick in die Dokumentation auf entscheidungstabellen (und DSL). In diesem Fall werden Sie wahrscheinlich wiederholen Sie den gesamten Pfad für jede Regel, aber das ist eigentlich ok in den meisten Fällen.
Ich hatte ein ähnliches problem und verwendet Neo4J Datenbank-Knoten als eine einfache und sehr flexible Regel-engine.
Sie verwenden können, ist es mit dem REST-service-Schnittstelle, so dass es unabhängig von der Hauptanwendung.
Sie können auch eine separate Anwendung, die Sie zum konfigurieren der Regeln (auch durch die Endnutzer).
Können Sie versuchen, die iLog-Frameworks cum rules engine.