Wie füge ich Fakten an Arbeitsspeicher zur Laufzeit in der Drools DRL und abrufen, die Sie bei der Ausführung die Ergebnisse einer stateless session?
Hintergrund:
Arbeite ich an einer Anwendung, die transformiert ein Objekt die Eingabe in eines der beiden Ausgangs-Objekten auf der Grundlage einer Reihe von drools-Regeln. Das Ausgabe-Objekt erst zur Laufzeit bekannt ist und es in der ersten Regel ausführen.
Hier ist die Regel, die erstellt die output-Objekt und ein Beispiel-transformationsregel:
rule "Initialization"
dialect "java"
salience 1000
no-loop true
when
t : Trade()
then
if(t.getTran().getInsType().equalsIgnoreCase("EEO") ||
t.getTran().getInsType().equalsIgnoreCase("EEF"))
{
insert(new Option());
}
else
{
insert(new Swap());
}
end
rule "Example Rule"
dialect "java"
when
t : Trade()
opt : Option()
then
opt.setCounterpartyName(t.getTran().getCParty());
end
Hier ist der code, der den Aufruf der Regeln:
private void test(){
for(File xmlFile : getXmlFilesFromDirectory(XML_DIRECTORY))
{
Trade trade = (Trade)unmarshall(xmlFile, Trade.class);
KnowledgeBase kbase = readKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsert(trade, "trade"));
commands.add(CommandFactory.newFireAllRules());
ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(commands));
logger.close();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception
{
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("security-transformation.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0)
{
for (KnowledgeBuilderError error: errors)
{
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
Problem:
Wenn ich ausführen, die Regeln, die ich nicht empfangen das Ausgabe-Objekt in meine Rücksendung Fakten. Ich erhalte die trade-Objekt zurück, aber ich komme nicht zurück die Option oder die Swap-Objekt, je nachdem, welches Hinzugefügt wurde, um den Arbeitsspeicher durch die erste Regel.
Frage:
Wie füge ich Fakten an Arbeitsspeicher zur Laufzeit in der drl und abrufen, die Sie bei der Ausführung die Ergebnisse einer stateless session?
BEARBEITEN:
Brauche ich eine drools-Abfrage?
- Bitte suugest auf diese Frage. Danke. stackoverflow.com/questions/20158726/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich ging voran und verwendet eine drools-Abfrage. Ich poste den code für jemand anderes, wer kommt.
Abfrage Hinzugefügt, um die oben genannten Regeln (Die Objekte verlängern
BaseTrade
):Code zum abrufen der Abfrageergebnisse aus der Ausführung: