Выполнение нескольких правил Drools в цепочке - приложение Spring Java - PullRequest
0 голосов
/ 01 марта 2019

Я интегрировал Drools с моим приложением Java Spring через зависимости Maven.Я создал KieContainer bean:

@Bean
public KieContainer kieContainer (){
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();

    File dir = new File("src/main/resources/rules");
    File[] directoryListing = dir.listFiles();
    if (directoryListing != null) {
        for (File child : directoryListing) {
            kieFileSystem.write(child.getName(), "UTF-8");
        }
    }

    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();

    KieModule kieModule = kieBuilder.getKieModule();
    return kieServices.newKieContainer(kieModule.getReleaseId());

}

Когда я отлаживаю это, я вижу, что оба моих .drl файла в / src / main /ресурсы / правила местоположение было успешно добавлено!

Кроме того, я создал KieSession:

public String executeRule(FieldCDO field, ContractCDO contract, FieldValueCDO fieldValue){
    KieSession kieSession = kieContainer.newKieSession();
    kieSession.setGlobal("fieldValue", fieldValue);
    kieSession.insert(field);
    kieSession.fireAllRules();
    kieSession.dispose();}

Затем я создал тест jUnit, из которого я вызвал метод сверху executeRule () и переданные объекты FieldCDO, ContractCDO, FieldValueCDO.

Мои правила выглядят так. Rule1.drl :

import com.calliduscloud.clma.domain.FieldCDO;
import com.calliduscloud.clma.domain.ContractCDO;
import com.calliduscloud.clma.domain.FieldValueCDO;

global com.calliduscloud.clma.domain.FieldValueCDO fieldValue;

dialect "mvel"

rule "Change contract field value 1"
     when
          field: FieldCDO(id == 1)
          contract: ContractCDO(id == 1);
     then
         fieldValue.setFieldValue("11111");
end

Rule2.drl :

import com.calliduscloud.clma.domain.FieldCDO;
import com.calliduscloud.clma.domain.ContractCDO;
import com.calliduscloud.clma.domain.FieldValueCDO;

global com.calliduscloud.clma.domain.FieldValueCDO fieldValue;

dialect "mvel"

rule "Change contract field value 2"
     when
          field: FieldCDO(id == 1)
          contract: ContractCDO(id == 1);
     then
         fieldValue.setFieldValue("22222");
end

Но когда я вызываю метод executeRule (), он ломаетсяв строке, где я добавляю глобальную переменную в KieSession:

kieSession.setGlobal("fieldValue", fieldValue);

Ошибка:

java.lang.RuntimeException: Неожиданное глобальное [fieldValue]

Когда я выполняю только одно правило, вызывая один и тот же код, все проходит без проблем.Но когда у меня есть эти два правила в цепочке, эта проблема возникает.

Если у кого-то есть идея, пожалуйста, напишите, если у вас есть время.

Спасибо, Dejan

1 Ответ

0 голосов
/ 02 марта 2019

Проблема может быть связана с определением глобала в обоих файлах DRL.Обратите внимание, что KieBuilder загрузит оба файла DRL для создания KieBase.Я бы попытался поместить глобальный и импорт в отдельный файл DRL, чтобы убедиться, что он загружается первым.Если вы создадите репродуктор и поместите его в GitHub, я могу попробовать.

...