2017-06-14 98 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); 
    } 
} 
}