2016-11-22 28 views
0

我想這樣做使用此一些驗證Drools的規則:StatelessKieSession不返回插入的對象

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 

我首先創建一個有狀態KieSession,預期該工作,還是第一次。但是,當我重新運行規則時,驗證事實仍在Memory中,這不是我想要的。所以,我試圖將這個例子調整爲無狀態的KieSession。

使用KieSession kSession

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

使用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"); 

的有狀態會話validations集合中返回一個Validation對象和無狀態KieSession返回一個空的集合。爲什麼???

KIE/Drools的:6.5.0.Final

的Java EE 7,上WildFly 10.1.0

回答

0

使用CDI找到它。我需要明確指定fireAllRules命令運行時的順序。此作品:

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");