在Drools 6中以编程方式创建新drools规则的新方法是什么?

时间:2014-12-19 16:51:30

标签: java drools rules drools-guvnor

简而言之,我想在运行时从规则库创建,编辑和删除规则。我无法弄清楚如何在drools 6 +中做到这一点。

我知道在先前版本的drools(< = 5.6)中,有一个.drl文件的XML表示形式和一个用于处理它的API:https://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch04.html#d0e8052

从5.6开始的drools文档表明这个已被弃用,它似乎在6处被完全删除。我不想使用已知没有直接升级路径的API。

由于工作流程要求以及Web用户界面的复杂性,将Guvnor或Workbench UI公开给用户进行规则编辑也不太合适。我想从Java代码创建和管理规则。

我想要一个比.drl文件的字符串模板更好的方法来创建新规则和修改规则。从Java以编程方式创建新规则的存在是什么?我已经做了很多搜索,但似乎无法为此找到一组Java API调用。

3 个答案:

答案 0 :(得分:8)

我不知道这是否是'接受'的方式,但是使用以下代码我在Drools 6中使用编程创建的规则来编辑.drl个文件。

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资源类。

答案 1 :(得分:1)

没有用于从Java代码构建规则的 stable API。当然,DRL编译器的解析器有一个API,但它不稳定且与DRL规则语法一样复杂,这是相当可观的。

XML是一个选项,其中至少左手边的语法足够简单,以5.2(IIRC)结束。现在,您可以使用Java的完整表达式语法等,并结合许多不同的方式来构建CE。

如果您的规则非常简单,您可能会想出一个可以使用可管理的API进行操作的规则模型。否则,您最好的选择是文本编辑器(当然还有Kie Workbench)。

答案 2 :(得分:1)

以编程方式创建规则的内置方法基于“Descr”流畅的API 直接操纵编译器的AST,绕过解析器。

查看课程org.drools.compiler.lang.api.DescrFactory

和类org.drools.compiler.lang.DrlDumper从AST中检索DRL近似值。