Wie kann ich die Regeln einer bestimmten Drools 6.3-Sitzung dynamisch ändern?
Ich habe eine Sitzung in Drools 6.3.x, die einige Millionen Fakten enthält.
Ich erstelle eine interaktive Anwendung, mit der der Benutzer unter anderem die Fakten nach Belieben filtern kann. In meinen Augen ist dieser Filter im Grunde ein Muster. Sobald die Fakten gefiltert sind, wird die Logik angewendet, um das gewünschte Ergebnis zu erzielen.
Aufgrund des interaktiven Charakters der Anwendung möchte ich lieber nicht auf die Benutzereingabe warten, um ein @ zu erstelleKieBase
, leite ein @ KieSession
, lade die paar Millionen Fakten und feuere die Regeln die ganze Zeit ab.
Ideally, ich möchte ein @ erstellKieBase
enthält die Logik der Anwendung einmal, leiten Sie einKieSession
einmal, lade alle Fakten einmal und die Inject / Remove-Regeln im laufenden Betrieb, abhängig von der Benutzereingabe. Wie kann ich das in Drools 6.3 machen? Ich weiß, dass es mit Drools 5 möglich war.
Einiger Code zur Kontextualisierung meiner Frage. Dieses Snippet zeigt, wie Sie die Drools-Sitzung einrichten:
KieHelper helper = new KieHelper();
String location = "/drools/logic.drl";
InputStream stream = getClass().getResourceAsStream(location);
Resource resource = ResourceFactory.newInputStreamResource(stream);
helper.addResource(resource, ResourceType.DRL);
Results results = helper.verify();
if (results.hasMessages(Message.Level.ERROR)) {
System.out.println(results.getMessages());
System.exit(0);
}
KieBase base = helper.build();
KieSession session = base.newKieSession();
for (Source source : sources) {
for (Object fact : source.getFacts()) {
session.insert(fact);
}
}
session.fireAllRules();
Soweit ich sehen kann, dieKieBase
bietet keine Möglichkeit, neue Regeln hinzuzufügen (nur Möglichkeiten, sie zu entfernen). Ich weiß also nicht, wie ich mit dem folgenden Snippet vorgehen soll, wenn das @ nicht initialisiert wirKieSession
von Grund auf neu..
String rule = "package boot\n" +
"\n" +
"rule \"Stamp\"\n" +
"when\n" +
"\t$o: Object()\n" +
"then\n" +
"\tSystem.out.println($o);\n" +
"end\n";
InputStream ruleStream = new ByteArrayInputStream(rule.getBytes());
Resource ruleResource = ResourceFactory.newInputStreamResource(ruleStream);
helper.addResource(ruleResource, ResourceType.DRL);
Irgendein Vorschlag