Я интегрировал 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