当前位置: 首页 > 知识库问答 >
问题:

在Drools6中,以编程方式创建新的drools规则的新的公认方式是什么?

庾君博
2023-03-14

简而言之,我希望在运行时从规则库中创建、编辑和删除规则。我很难弄清楚如何在Drools6+中做到这一点。

共有1个答案

司寇苗宣
2023-03-14

我不知道这是否是“接受”的方式,但是通过下面的代码,我将.drl文件与Drools6中以编程方式创建的规则结合起来。

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);
    }
}

我使用番石榴资源类。

 类似资料:
  • 我正在把一些业务规则放入drool工程中。我们不能使用KIE工作区UI来编写规则。所以这是出局了。 我的问题是我无法使这个工作。代码运行良好,但我无法看到drl文件被写入。在调试模式下,我可以看到具有正确drl结构的字符串对象。以前有人遇到过这个问题吗? 我在github上看到了一些例子,人们已经完成了在spring Boot中集成drools的yoman工作。我可以从构建我的服务开始,但我需要确

  • 问题内容: 我正在尝试以编程方式在Java中创建新的密钥库。如下代码: 引发未初始化的KeyStore异常。 问题答案: 创建密钥库后,需要将其加载。load方法要求读取FileInputStream,但是如果您提供一个null,则将加载一个空的KeyStore。 看到这个链接

  • 问题内容: 我最困难的时间是在WooCommerce中以编程方式创建订单。我正在使用下面的代码,是否正在创建订单,但是我无法获得客户信息或添加到订单的产品线项目。创建的新订单只是访客,没有任何物品,用户信息等。 问题似乎是,一旦创建了订单对象,尝试向订单中添加数据时就会失败。 这是我在日志中遇到的错误: 任何帮助,将不胜感激! 问题答案: 问题出在您的动作挂钩上。使用以下钩子: 确保给定的产品ID

  • 任何关于这个或者如何使用drools api修改drools规则的想法都将是有用的。 注意:我不想为修改规则做字符串替换。

  • 我正在使用一个DMN来评估我的输入,但需求是这样的规则将被添加在未来,规则将被添加由正常的用户。因此,我关心的是如何提供一个逻辑来动态更新/添加DMN中的规则,并在camunda Tomcat中更新它。我经历了部署、创建和重新部署rest api,但无法解决我的问题。

  • 问题内容: 我希望能够以编程方式添加新的cron作业,最佳方法是什么? 从我的研究来看,我似乎可以转储当前的crontab,然后附加一个新的crontab,然后将其重新管道到crontab中: 有没有更好的办法? 问题答案: 对我来说一直很好。 您应该考虑一个稍微复杂的脚本,它可以完成三件事。 附加crontab行;确保它不存在。当它已经存在时添加是不好的。 删除crontab行。也许只有警告,如