在Drools 6中以编程方式创建新drools规则的新方法是什么? [英] What is the new accepted way of programmatically creating new drools rules in Drools 6?

查看:227
本文介绍了在Drools 6中以编程方式创建新drools规则的新方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In short I want to create, edit and delete rules from a rules repository at runtime. I'm having trouble figuring out how to do this in 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

I know in a previous version of drools (<= 5.6), that there was an XML representation of a .drl file and an API for working with it: https://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch04.html#d0e8052.

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

The drools documentation as of 5.6 indicates this deprecated and it appears to be completely removed at 6. I don't want to use an API that is already known to have no direct upgrade path.

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

Exposing the Guvnor or Workbench UIs to users for rules editing is also not a good fit here due to workflow requirements and due to the complexity of the web user interfaces. I want to create and manage the rules from Java code.

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

I want a better method than string templating to a .drl file for creating new rules and modifying rules. What exists for programmatically creating new rules from Java? I have done a lot of searching but can't seem to find a set of Java API calls for this.

推荐答案

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

I don't know if this is the 'accepted' way, but with the following code I comine .drl files with programmatically created rules in 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);
    }
}

我使用番石榴资源类。

这篇关于在Drools 6中以编程方式创建新drools规则的新方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆