Каков новый общепринятый способ программного создания новых правил слюни в Drools 6?

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

Я знаю, что в предыдущей версии слюни (‹= 5.6) было XML-представление файла .drl и API для работы с ним: https://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch04.html#d0e8052.

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

Предоставление пользователям пользовательских интерфейсов Guvnor или Workbench для редактирования правил также не подходит из-за требований рабочего процесса и из-за сложности пользовательских веб-интерфейсов. Я хочу создавать правила и управлять ими из кода Java.

Мне нужен лучший метод, чем создание строковых шаблонов для файла .drl, для создания новых правил и изменения правил. Что существует для программного создания новых правил из Java? Я много искал, но, похоже, не нашел для этого набора вызовов Java API.


person Peter Smith    schedule 19.12.2014    source источник


Ответы (3)


Я не знаю, является ли это «приемлемым» способом, но с помощью следующего кода я объединяю .drl файлы с программно созданными правилами в Drools 6.

public KieContainer build(KieServices kieServices) {
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    ReleaseId rid = kieServices.newReleaseId("com.example.rulesengine", 
        "model-test", "1.0-SNAPSHOT");
    kieFileSystem.generateAndWritePomXML(rid);

    kieFileSystem.write("src/main/resources/rules.drl", 
        getResource(kieServices, "rules.drl"));

    addRule(kieFileSystem);

    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
        throw new RuntimeException("Build Errors:\n" + 
           kieBuilder.getResults().toString());
    }

    return kieServices.newKieContainer(rid);
}

private void addRule(KieFileSystem kieFileSystem) {
    PackageDescrBuilder packageDescrBuilder = DescrFactory.newPackage();
    packageDescrBuilder
            .name("com.example.model")
            .newRule()
            .name("Is of valid age")
            .lhs()
            .pattern("Person").constraint("age < 18").end()
            .pattern().id("$a", false).type("Action").end()
            .end()
            .rhs("$a.showBanner( false );")
            .end();

    String rules = new DrlDumper().dump(packageDescrBuilder.getDescr());
    kieFileSystem.write("src/main/resources/rule-1.drl", rules);
}

private Resource getResource(KieServices kieServices, String resourcePath) {
    try {
        InputStream is = Resources.getResource(resourcePath).openStream(); //guava
        return kieServices.getResources()
                  .newInputStreamResource(is)
                  .setResourceType(ResourceType.DRL);
    } catch (IOException e) {
        throw new RuntimeException("Failed to load drools resource file.", e);
    }
}

Я использую класс ресурсов Guava.

person Tim Van Laer    schedule 10.04.2015
comment
Ух ты, DescFactory API для построения динамических правил кажется таким крутым и гибким. Только как его использовать? Зачем вам создавать динамическое правило на Java? Разве не смысл в том, чтобы правило DRL было вынесено вовне? - person Michael Plautz; 28.06.2015
comment
Это было бы полезно при переносе существующего набора правил в файлы DRL. Это то, что я сейчас пытаюсь достичь. - person nixnayak; 31.01.2017
comment
Оформить заказ github.com/trmsmy/drools-example @Tim ... это твое? - person sureshvv; 25.09.2019

Встроенный способ программного создания правил основан на свободно распространяемом API «Descr», который напрямую управляет AST компилятора, минуя синтаксический анализатор.

см. класс org.drools.compiler.lang.api.DescrFactory

и класс org.drools.compiler.lang.DrlDumper для получения приближения DRL из AST.

person Davide Sottara    schedule 23.12.2014
comment
Хорошо, но как вы оцениваете встроенный PackageDescr? - person Tim Van Laer; 08.04.2015

Не существует стабильного API для построения правил из кода Java. Конечно, есть API для парсера компилятора DRL, но он нестабилен и так сложен, как синтаксис правил DRL, а это значительный объем.

XML был вариантом, в котором по крайней мере левый синтаксис был достаточно простым, что заканчивалось на 5.2 (IIRC). Теперь вы можете использовать полный синтаксис выражений Java и многое другое в сочетании со многими различными способами составления CE.

Если ваши правила исключительно просты, вы можете придумать модель правил, которыми можно было бы управлять с помощью управляемого API. В противном случае лучше всего использовать текстовый редактор (или, конечно, Kie Workbench).

person laune    schedule 23.12.2014