Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在drools 6中以编程方式创建新的drools规则的新方法是什么?_Java_Drools_Rules_Drools Guvnor - Fatal编程技术网

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

Java 在drools 6中以编程方式创建新的drools规则的新方法是什么?,java,drools,rules,drools-guvnor,Java,Drools,Rules,Drools Guvnor,简而言之,我希望在运行时从规则存储库中创建、编辑和删除规则。在drools 6+中,我很难想出如何做到这一点 我知道在drools的前一个版本中(没有用于从Java代码构建规则的稳定API。当然,有一个用于DRL编译器解析器的API,但它不稳定,也不像DRL规则语法那样复杂,这是相当可观的 XML是一种至少左侧语法足够简单的选项,以5.2(IIRC)结尾。现在,您可以使用Java的完整表达式语法和更多语法,并结合多种不同的方法来编写CEs 如果您的规则非常简单,您可能会提出一个可以使用可管理AP

简而言之,我希望在运行时从规则存储库中创建、编辑和删除规则。在drools 6+中,我很难想出如何做到这一点

我知道在drools的前一个版本中(没有用于从Java代码构建规则的稳定API。当然,有一个用于DRL编译器解析器的API,但它不稳定,也不像DRL规则语法那样复杂,这是相当可观的

XML是一种至少左侧语法足够简单的选项,以5.2(IIRC)结尾。现在,您可以使用Java的完整表达式语法和更多语法,并结合多种不同的方法来编写CEs


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

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

请参见类
org.drools.compiler.lang.api.DescrFactory


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

我不知道这是否是“可接受的”方式,但通过以下代码,我在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);
    }
}
公共容器构建(KieServices-KieServices){
KieFileSystem KieFileSystem=kieServices.newKieFileSystem();
ReleaseId rid=kieServices.newReleaseId(“com.example.rulesengine”,
“模型试验”、“1.0-快照”);
kieFileSystem.generateAndWritePomXML(rid);
kieFileSystem.write(“src/main/resources/rules.drl”,
getResource(kieServices,“rules.drl”);
addRule(kie文件系统);
KieBuilder KieBuilder=kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
if(kieBuilder.getResults().hasMessages(Message.Level.ERROR)){
抛出新的运行时异常(“生成错误:\n”+
kieBuilder.getResults().toString());
}
退货服务。纽基集装箱(rid);
}
私有void addRule(文件系统){
PackageDescrBuilder PackageDescrBuilder=DescrFactory.newPackage();
包装描述器
.name(“com.example.model”)
.newRule()
.姓名(“有效年龄”)
.lhs()
.模式(“人”).约束(“年龄<18”).结束()
.pattern().id($a),false).type(“Action”).end()
(完)
.rhs($a.showBanner(假);)
.end();
字符串规则=new DrlDumper().dump(packageDescrBuilder.getDescr());
kieFileSystem.write(“src/main/resources/rule-1.drl”,rules);
}
私有资源getResource(KieServices,String resourcePath){
试一试{
InputStream is=Resources.getResource(resourcePath).openStream();//番石榴
return.services.getResources()
.newInputStreamResource(is)
.setResourceType(ResourceType.DRL);
}捕获(IOE异常){
抛出新的运行时异常(“加载drools资源文件失败。”,e);
}
}

我使用Resources类。

好的,但是如何评估构建的PackageDescr?哇,用于动态规则构建的DescFactory API看起来非常酷和灵活。只是,它的用例是什么?为什么要用Java构建动态规则?首先让DRL规则外部化不是重点吗?它在迁移应用程序时非常有用DRL文件的现有规则集。这就是我目前试图实现的。Checkout@Tim…是你的吗?