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?

InformationsquelleAutor gregwhitaker | 2011-05-03
Schreibe einen Kommentar