2016-11-22 6 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 

Я первым создал Statefull KieSession, который работает, как и ожидалось, в первый раз. Однако, когда я повторяю правило, факты проверки остаются в памяти, чего я не хочу. Итак, я попытался настроить пример на безгражданство 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"); 

statefull сессия возвращает Validation объект в validations коллекции и лица без гражданства KieSession возвращает пустую коллекцию. Зачем???

КИЕ/Drools: 6.5.0.Final

Java EE 7, с помощью CDI на WildFly 10.1.0

ответ

0

Нашел. Мне нужно явно указать порядок, когда запускается команда 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"); 

 Смежные вопросы

  • Нет связанных вопросов^_^