2016-11-22 4 views
0

Ich möchte einige Validierung tun dies mit Drools Regel:StatelessKieSession nicht zurück eingefügt Objekte

rule "Test" 
    when 
     MyRequest(paymentTerm == PaymentTerm.MONTH); 
    then 
     Validation val = new Validation(); 
     val.setIsValid(true); 
     val.setDescription("It's a monthly term!"); 
     insert(val); 
end 

Ich habe zuerst eine Statefull KieSession, die wie erwartet funktioniert, das erste Mal. Wenn ich die Regel jedoch erneut ausfühle, befinden sich die Validierungsdaten immer noch im Speicher, was ich nicht möchte. Also habe ich versucht das Beispiel auf eine zustandslose KieSession einzustellen.

Mit KieSession kSession:

kSession.insert(req); 
    kSession.fireAllRules(); 
    Collection<?> validations = kSession.getObjects(new ClassObjectFilter(Validation.class)); 

Mit StatelessKieSession kSession:

List<Command> cmds = new ArrayList<>(); 
    cmds.add(CommandFactory.newInsert(req, "request")); 
    cmds.add(CommandFactory.newGetObjects(new ClassObjectFilter(Validation.class), "validations")); 
    ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(cmds)); 
    Collection<?> validations = (Collection<?>) results.getValue("validations"); 

Die zustandsbehaftete Session gibt ein Validation Objekt in der validations Sammlung und die staatenlos KieSession gibt eine leere Sammlung. Warum???

KIE/geifert: 6.5.0.Final

Java EE 7, mit CDI auf Wildfly 10.1.0

Antwort

0

es gefunden. Ich muss die Reihenfolge explizit angeben, wenn der Befehl FireAllRules ausgeführt wird. Dies funktioniert:

List<Command> cmds = new ArrayList<>(); 
    cmds.add(CommandFactory.newInsert(req, "request")); 
    cmds.add(CommandFactory.newFireAllRules()); 
    cmds.add(CommandFactory.newGetObjects(new ClassObjectFilter(Validation.class), "validations")); 
    ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(cmds)); 
    Collection<?> validations = (Collection<?>) results.getValue("validations"); 
Verwandte Themen