Drools Creating Rules(DRL)以编程方式在drools-distribution-6.5.0.Final中不起作用

时间:2017-06-14 12:37:09

标签: drools

我正在努力将一些业务规则放在流口水引擎中。我们无法使用KIE工作区用户界面来创作规则。所以就是这样。

问题陈述:创建一个应用程序(前端角度UI)后端弹簧启动微服务来创作规则。这些创作的规则需要动态刷新,而不必重新启动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文件被写入。在调试模式下,我可以看到具有正确drl结构的字符串对象。有没有人遇到这个之前的问题。?

我在github上看到了一些例子,人们已经完成了yoman的工作,在春季启动时集成了drools。我可以从构建我的服务开始,但我需要确定这可能做的事情

1 个答案:

答案 0 :(得分:0)

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

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