我正在尝试向已使用 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/