Пускает fireAllRules с несколькими фактами в сеансе, как узнать, какой факт не удался - PullRequest
0 голосов
/ 14 февраля 2020

Я вставляю несколько фактов в сеанс drools и вызываю fireAllRules в сеансе. Если какой-либо из фактов терпит неудачу, генерируется исключение, и правило не выполняется для остальных фактов.

Мой вопрос:

  1. Есть ли способ продолжить выполнение оставшихся фактов, даже если один факт потерпел неудачу?
  2. Есть ли способ узнать факты, которые не сработали, среди множества фактов, вставленных в сеанс?

// Мой scala фрагмент кода:

val ruleSession:KieSession = kBase.newKieSession();

ruleSession.insert(fact1);
ruleSession.insert(fact2);
ruleSession.insert(fact3);

ruleSession.fireAllRules()
ruleSession.dispose()

Дайте мне знать любые полезные мысли. Спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Это должно соответствовать первому требованию.

val ruleSession:KieSession = kBase.newKieSession();

ruleSession.insert(fact1);
ruleSession.fireAllRules()

ruleSession.insert(fact2);
ruleSession.fireAllRules()

ruleSession.insert(fact3);
ruleSession.fireAllRules()

ruleSession.dispose()
0 голосов
/ 15 февраля 2020

Как видно из приведенной выше ссылки в комментарии (от Prog_G), я реализовал ConsequenceExceptionHandler и изящно обработал исключение в методе handleException, зарегистрировал сбойный факт и удалил его из выполнения дальнейших правил, пример кода приведен ниже. Надеюсь, что это поможет кому-то, имеющему похожие варианты использования.

// Создание сеанса Drools

KieBaseConfiguration kconfig = new RuleBaseConfiguration();
kconfig.setProperty(ConsequenceExceptionHandlerOption.PROPERTY_NAME, "com.xxx.RuleExceptionHandler"); // set my exception handler name to RuleBaseConfiguration
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kieBase = kContainer.newKieBase("ims-hw-rules",kconfig); // create KieBase passing the config
KieSession kSession = kieBase.newKieSession();

// Реализация ConsequenceExceptionHandler.

public class RuleExceptionHandler implements ConsequenceExceptionHandler{
    @Override
    public void handleException(Match match, RuleRuntime workingMemory, Exception exception) {

        //if(exception instanceof MyException) {
            if(match.getObjects().size() >0) {
                for (Object object : match.getObjects()) {
                    JSONData fact = (JSONData) object;
                    //logFailedFact(fact);
                }
            }

            if(match.getFactHandles()!= null) {
                for (FactHandle factHandle : match.getFactHandles()) {
                    workingMemory.delete(factHandle); // delete the failed fact from executing remaining rules.
                }
            }
        //}
    }
}
...