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

Drools创建规则(DRL)以编程方式在Drools-Distribution-6.5.0.final中不工作

公羊学义
2023-03-14

我正在把一些业务规则放入drool工程中。我们不能使用KIE工作区UI来编写规则。所以这是出局了。

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

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

共有1个答案

公羊俊德
2023-03-14

下面的代码将帮助您使用code创建drool规则。这不是推荐的方法,大多数人使用kie-web界面来设计和修改drool规则。不知道如何修改已经创建的。DRL文件。但这给了我一个开始

包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);
    }
}
}
 类似资料:
  • 我试图将我的流程变量放入业务规则任务中,并在该任务中更改该变量,但值保持不变。我做错了什么?流程是在kie工作台中开发的,不使用Eclipse。 在触发规则之前,我的变量在脚本任务中初始化,如 谢谢你的帮助!

  • 我对商业规则的世界还很陌生,但我想我已经理解了Drools Expert和Drools Guvnor的概念,但我仍然有点困惑,与Expert相比,到底是如何/何时/为什么使用Guvnor的。而且,无论他们是相互排斥,还是有能力,甚至更愿意并肩工作。下面是一些让我感到困惑的突出主题,以及我关注的问题背后的一些解释,主要集中在应用程序的可维护性上。 Guvnor是否具有Expert plus more

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

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

  • 想想有没有一种方法可以使用Drools API将drl文件转换为excel工作表? 我们目前使用的是Drools 5.3,但实际上可以使用任何版本。 提前感谢

  • 我对流口水还很陌生,可能正在做一些非常愚蠢的事情。问题是,出于某种原因,我的口水规则没有被解雇。使用的drools版本为5.4 如果有帮助,当我转换回并使用执行方法来触发规则时,规则会触发。但是,我需要使用来过滤规则,并且我了解还不支持议程过滤器。作为第一步,我只是将会话翻转到,插入事实并触发所有规则。 不得不谦恭地说,在过去几天里,我在这件事上伤了头。太糟糕了,文档对drools来说不是那么友好