Drools 创建规则(DRL)以编程方式在 drools-distribution-6.5.0.Final 中不起作用

标签 drools

我正在努力将一些业务规则放入 drool 引擎中。我们无法使用 KIE 工作区 UI 来编写规则。所以这已经结束了。

问题陈述:创建一个应用程序(前端Angular UI)后端Spring Boot微服务来编写规则。这些编写的规则需要动态刷新,而无需重新启动jvm和其他想要使用这些规则的微服务,应该使用它们。例如:基于经销商信用历史、银行期限以及可能根据作者设计的任何新规则授予信用或利率。我开始研究这个,理论上可以通过使用 drools 编译器的 API 来构建类似的东西图书馆。 这里有代码示例。 为了实时刷新,有一个叫做KnowledgeAgent的东西。 https://docs.jboss.org/drools/release/5.2.0.Final/drools-guvnor-docs/html/ch09.html

What is the new accepted way of programmatically creating new drools rules in Drools 6?

我的问题是我无法完成这项工作。代码运行良好,但我看不到 drl 文件被写入。在 Debug模式下,我可以看到具有正确 drl 结构的字符串对象。有人遇到过这个吗之前有问题。?

我在 github 上看到了一些示例,人们已经完成了 yoman 工作,将 drools 集成到 spring boot 中。我可以从构建我的服务开始,但我需要确保这是可以做到的

最佳答案

以下代码将帮助您使用代码创建 drool 规则。这不是推荐的方式,大多数人使用 kie-web 界面来设计和修改 drool 规则。不确定我们如何修改已经创建的 .drl 文件。但是这个给了我开始。Going

包com.sample.model;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

import org.drools.compiler.lang.DrlDumper;
import org.drools.compiler.lang.api.DescrFactory;
import org.drools.compiler.lang.api.PackageDescrBuilder;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Message;
import org.kie.api.builder.ReleaseId;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;

//@SuppressWarnings("restriction")
public class GenerateRule {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    KieContainer container=build(KieServices.Factory.get());
    System.out.println(container.getReleaseId());
    System.out.println(container.getKieBase());
  }

  public static KieContainer build(KieServices kieServices){

     KieFileSystem fileSystem=kieServices.newKieFileSystem();    
     ReleaseId releaseId=kieServices.newReleaseId("com.example.rulesengine", 
         "model-test", "1.0-SNAPSHOT");
     fileSystem.generateAndWritePomXML(releaseId);
     //fileSystem.write("D:/workspace/DroolSamples/src/main/resources/rules/rules.drl", getResource(kieServices, "D:/workspace/DroolSamples/src/main/resources/rules/rules.drl"));
     addRule(fileSystem);

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

     return kieServices.newKieContainer(releaseId);
  }
 @SuppressWarnings("restriction")
  private static void addRule(KieFileSystem kieFileSystem) {
    PackageDescrBuilder packageDescrBuilder = DescrFactory.newPackage();


    packageDescrBuilder
            .name("com.sample.model")
            .newRule()
            .name("Is of valid age")
            .lhs()

            .pattern("Person").constraint("age < 18")
            .id("$a", true).end()
            //.pattern().id("$a", false).end()
            .end()
            .rhs("$a.setShowBanner( false );")
            //.rhs("insert(new Person())")
            .end();


    String rules = new DrlDumper().dump(packageDescrBuilder.getDescr());

    KieFileSystem fileSystem=kieFileSystem.write("D:/newrule.drl", rules);
    try{
      // create new file
      File file = new File("src/main/resources/rules/test.drl");
      file.createNewFile();
      FileWriter fw = new FileWriter(file.getAbsoluteFile());
      BufferedWriter bw = new BufferedWriter(fw);
      bw.write(rules);
      // close connection
      bw.close();
      System.out.println("File Created Successfully");
   }catch(Exception e){
       System.out.println(e);
   }


}
  private static Resource getResource(KieServices kieServices, String resourcePath) {

    try {
     //   InputStream is = com.google.common.io.Resources.getResource(resourcePath).openStream(); //guava
        InputStream is=new FileInputStream(new File(resourcePath));
        return kieServices.getResources()
                  .newInputStreamResource(is)
                  .setResourceType(ResourceType.DRL);
    } catch (IOException e) {
        throw new RuntimeException("Failed to load drools resource file.", e);
    }
}
}

关于Drools 创建规则(DRL)以编程方式在 drools-distribution-6.5.0.Final 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44545014/

相关文章:

java - 使用 Drools 的动态规则

java - 使用业务中心和 JBPM 调用 REST 服务

java - Drools "then"中 Java 调用的性能和可维护性

java - 为什么 Drools 在使用议程过滤器触发特定规则时验证所有其他规则?

drools - “Drools Camel 服务器”与 'KIE-WB Execution Server'

java - Scala 中的 Drools Expert 输出对象

java - 从 Drools 6.0.1 迁移到 Drools 6.3.0-Final 出现意外的全局 [log] 错误

java - 如何将数据库(MySql)与drools项目连接?

java - 用于复杂显示值查找的 Drools

java - Drools 中的正则表达式