2017-06-14 97 views
0

我正在努力把一些业务规则放在口水engine.We不能使用KIE工作区UI来编写规则。所以这是出。Drools创建规则(DRL)编程方式不工作在drools-distribution-6.5.0.Final

问题陈述:创建一个应用程序(前端角UI)后端弹簧引导微服务到作者规则。这些创作规则需要动态刷新,而不必重启想要使用这些规则的jvm和其他微服务,应该使用它们。例如:授予信用或利率基于经销商的信用记录,银行的持续时间和任何可能根据作者设计的新规则。我开始寻找这个,理论上可以通过使用口头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?

我的问题是我不能够让这个work.Code运行良好,但我不能看到DRL文件中获取written.In调试模式下,我可以看到字符串对象有适当的drl structure.Has之前有任何人遇到过这个问题。?

我看到在github上一些例子,人们已经做yoman工作在春季boot.I可以建立我的服务启动Drools的整合,但我需要确保这东西是可以做到的

+0

这还不清楚。哪些代码应该写出一个DRL文件,而不是“看到drl文件正在写入”? – laune

+0

https://stackoverflow.com/questions/27570431/what-is-the-new-accepted-way-of-programmatically-creating-new-drools-rules-in-dr – MrWayne

+0

你想在哪里“查看drl文件被写入“,你如何确认它不是? - 对于那些试图帮助你的人来说,这是很难的。 – laune

回答

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