Gibran Castillo Ответов: 2

Java 8, drools 5.x и drools 7.x


я с помощью слюнки текут 5.х (слюнки текут-компилятор 5.2.1.Финал, слюнки текут-decisiontables 5.4.0.Окончательной, и слюнки текут-шаблоны 5.4.0.Финал; jBPM в поток 5.1.1.Финал, которого jBPM-bmpn2 5.1.1.Окончательной и их соответствующих зависимостей) для Java с работы, я построить/запустить его с Java 1.7.0_21. Моя нынешняя установка работает нормально. Я использую таблицу решений (электронную таблицу).

Я могу построить/запустить свой проект с Java 1.8.0_162, используя drools 5.x, как описано выше; однако, когда задание java запускается, оно загружает таблицу решений (электронную таблицу), но не запускает ни одно из правил, я не получаю исключения в последней строке, которая выполняется:

Properties props = new Properties();
    
    KnowledgeBuilderConfiguration configuration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(props);
    
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newDecisionTableConfiguration(configuration);
    
    DecisionTableConfiguration config = KnowledgeBuilderFactory.newDecisionTableConfiguration();
    
    config.setInputType(DecisionTableInputType.XLS);
    
    kbuilder.add(ResourceFactory.newClassPathResource(spreadsheetFile), ResourcType.DTABLE, config);  // last line executed and then job exists and completes successfully.

Перед выполнением последней строки Я поместил несколько журналов отладки и они показывают следующее:

>> Properties (props):  {}

>> KnowledgeBuilderConfiguration (configuration): org.drools.compiler.PackageBuilderConfiguration@630cb4a4

>> KnowledgeBuilder (kbuilder):  org.drools.builder.impl.KnowledgeBuilderImpl@239bof9d

>> ResourceFactory.newClassPathResource(spreadsheetFile):  [ClassPathResource path='spreadsheet.xls']

>> ResourceType.DTABLE:  ResourceType = 'Decision Table'

>> DecisionTableConfiguration (config):  org.drools.builder.conf.impl.DecisionTableConfigurationImpl@150ab4ed

>> DecisionTableConfiguration (config.getInputType()):  XLS




Поэтому я решил перейти с drools 5.5.0 на 7.5.0 и использовать kie-api/kie-ci; мне пришлось сделать некоторый рефакторинг, потому что теперь drools является частью зонтика KIE (Knowledge Is Everything), см. код ниже:

KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession ks = kc.newKieSession("ksession-dtables");  //stateful session
FactHandle fh = ks.insert(fact);
ks.fireAllRules();


....

Пакеты и правила загружаются в базу знаний, но запускаются только первые правила, а затем она останавливается, нужно ли мне обновить таблицу решений (электронную таблицу), чтобы работать для drools 7.5.0 с Java 8?



Любые предложения приветствуются.



Спасибо!!

Что я уже пробовал:

Выяснение того, нужно ли мне изменить свою таблицу решений (электронную таблицу) и отладить код, чтобы найти виновника.

2 Ответов

Рейтинг:
2

Member 14905745

Я работал над Drools в 2012 году и снова работаю над ним сейчас с версией 7.
Похоже, я могу заставить его работать с этим кодом

частная пустота getKieRepository() {
if(kieServices == null) {
kieServices = KieServices.Фабрика.вам();
}
окончательный kieRepository KieRepository = kieServices.getRepository();
kieRepository.addKieModule(новый KieModule() {
public ReleaseId getReleaseId() {
вернуться kieRepository.getDefaultReleaseId();
}
});
}

@Боб
публичная сессия kiesession getKieSession() {
Системы.методов-setproperty("слюнки текут.dateformat","MMddyyyy");
getKieRepository();
generateDrl();
KieFileSystem KieFileSystem = kieServices.newKieFileSystem();
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + "rules.xlsx"));
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
КБ.buildAll();
Результаты results = kb.getResults();
если(результат.hasMessages(сообщение.Уровень.ОШИБКА)) {
для(сообщение message : results.getMessages()) {
Системы.из.код println ("сообщение".с текстом());
}
throw new IllegalStateException("###errrors###");
}
KieModule kieModule = kb.getKieModule();
KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieSession kieSession = kContainer.newKieSession();
вернуться kContainer.newKieSession();
}


Рейтинг:
1

Gibran Castillo

Я использовал drools 6.5.0, и все, кажется, работает правильно. Похоже, что drools 7.0.0 и выше используют другой формат таблицы решений (электронной таблицы).