Drool принимает обновленное правило

Я хотел бы отделить бизнес-логику от веб-приложения (spring MVC + Hibernate) для лучшей ремонтопригодности, и я не хочу перезапускать сервер для изменения бизнес-логики. Если я изменю файл DRL для изменения бизнеса, выберет ли механизм drool последний DRL?

Я сделал тестовое приложение, но обновленный файл DRL не загружается в «Базу знаний». Есть ли способ загрузить обновленные DRL/правила в движок Drools без перезагрузки сервера?

Account.java

public class Account {
private Integer balance;
   // setter & getter
}

И в тестовой программе есть:

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("myrule.drl"), ResourceType.DRL);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();

    StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
    Account account = new Account(1000);
    account.withdraw(500);
    ksession.execute(account);

И ДХО

rule "belowLimit" when $account : Account( balance < 700 ) then System.out.println("Notify user"); end


person Tony    schedule 07.12.2014    source источник


Ответы (3)


Версии Drools 5.x (которые вы, по-видимому, используете) содержат наборы изменений, которые определяют каталоги или файлы, которые нужно отслеживать на наличие изменений, чтобы база знаний автоматически перестраивалась, а сеансы, запущенные после этого, могли отражать новую базу знаний.

Детали можно найти в документации, см. раздел «База знаний по конфигурации с использованием наборов изменений» и его преемник. Это действительно слишком много, чтобы повторять все это здесь.

person laune    schedule 07.12.2014

6.x теперь делает это намного проще. Он основан на управлении версиями maven. KieContainer (содержит биты времени выполнения) может быть запущен снова с любой версией jar. Затем вы также можете обновить его до любой версии jar, используя метод updateToVersion. Наконец, kie-ci предоставляет встроенную поддержку maven для автоматических обновлений и разрешений из внешних репозиториев maven с использованием стандартов обновления версии maven. http://docs.jboss.org/drools/release/6.0.0.Final/drools-docs/html/KIEChapter.html#BuildDeployUtilizeAndRunSection

person Mark Proctor    schedule 12.12.2014

Вы должны использовать KieScanner для достижения этого. Вот цитата из документации:

KieScanner позволяет осуществлять непрерывный мониторинг вашего репозитория Maven, чтобы проверить, установлена ​​ли новая версия проекта Kie. Новый выпуск развертывается в контейнере KieContainer, обертывающем этот проект. Для использования KieScanner требуется, чтобы kie-ci.jar находился в пути к классам.

KieServices kieServices = KieServices.Factory.get();
ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "myartifact", "LATEST" );
KieContainer kContainer = kieServices.newKieContainer( releaseId );
KieScanner kScanner = kieServices.newKieScanner( kContainer );

// Start the KieScanner polling the Maven repository every 10 seconds
kScanner.start( 10000L );

Вы также можете использовать ks.scanNow().

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

person ashish verma    schedule 09.09.2019