java - 将规则添加到现有的 KiePackage 和 KieBase 中

标签 java drools kie

我正在尝试向已使用 KieBuilder 定义和构建的 KiePackage 添加规则。

我知道您可以使用以下方法删除规则:

base.removeRule("com.somepackage", "ruleName");

但是有没有相当于添加规则的方法呢?我尝试将新的 .drl 文件添加到 KieFileSystem 中并使用 KieScanner 来获取更改,但它似乎不起作用:

KieBaseConfiguration config = service.newKieBaseConfiguration();
KieBase base = kContainer.newKieBase(config);

KieFileSystem fileSystem = service.newKieFileSystem(); 
KieBuilder builder = service.newKieBuilder(fileSystem); 

fileSystem.write(originalDrlFile, someFile)    
builder.buildAll()                               // first drl is loaded

fileSystem.write(newlDrlFile, someFile)    

KieScanner scanner = service.newKieScanner(kContainer);
scanner.scanNow();
KieSession ksession1 = kContainer.newKieSession();    

builder.buildAll()                               // reloading with new drl.

当我根据 ksession1 评估事实时,KieBase 中不存在新规则。我错过了什么吗?

最佳答案

private KieSession kieSession;
public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();

    KieFileSystem kfs = kieServices.newKieFileSystem();
    FileInputStream fis2 = new FileInputStream( "override/r2.drl" );
    kfs.write( "src/main/resources/r2.drl",
                kieServices.getResources().newInputStreamResource( fis2 ) );
    FileInputStream fis1 = new FileInputStream( "override/r1.drl" );
    kfs.write( "src/main/resources/r1.drl",
                kieServices.getResources().newInputStreamResource( fis1 ) );

    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();

    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    }

    KieContainer kieContainer =
        kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );

    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieContainer.newKieSession();
}

build 方法说明了增量构建。要添加规则,您可以再次使用带有新规则的附加 DRL 文件来完成整个过程。或者,如果保留 KieFileSystem,则可以稍后添加 DRL 文件,再次调用 buildAll,重新创建 KieBase 等。

关于java - 将规则添加到现有的 KiePackage 和 KieBase 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563049/

相关文章:

java - FragmentPagerAdapter 中的 RecyclerView 泄漏

java - Java数据结构的空间复杂度

java - 套接字连接不适用于无 IP 地址

java - Drools 中的工作内存和对象插入行为

drools - 如何迭代 drools 文件中的 List<HashMap> 并更新 Hash Map 对象并返回更新后的 List

java - 执行我的 drools 规则后如何返回多个 Assets ?

java.lang.ClassNotFoundException : org. eclipse.aether.resolution.ArtifactResolutionException

java - 如何在android上选择线程池的大小

jboss - 将Drools与JBossESB集成

java - 加载全局事件监听器JBPM