我正在研究将由多个Maven工件表示的多个KieModule
部署到单个KieContainer
中的方法。这是我的要求:
用户定义规则,打包规则,
他们将软件包安装在Maven仓库中,
他们使用RESTful api通知Spring应用程序,其中已部署了带有某些groupId,artifactId和版本的新规则(在请求正文中),因此应用程序可以选择新的KieModule
并将其添加到KieContainer
。
基本上,很棒的是:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
kContainer.addKieModule(someKieModule); // This doesn't exist
kContainer.addKieModule(someOtherKieModule); // This doesn't exist
到目前为止,我所能看到的是
KieContainer
和KieModule
之间存在一对一的关系。这是真的?我还知道,我可以将我的工件分组到父工件下,并在每次更新时对其进行部署,但是我不想强制业务用户将其工件分组(因为这也会使它们依赖于每个工件)。其他)。我也对如何实现此目标的其他建议持开放态度(也许有多个
KieModule
文件,循环浏览它们,并将它们一个接一个地添加到KieContainer
中)?提前致谢。
更新资料
我也在尝试
DeploymentService
,特别是KModuleDeploymentService
,但是我不确定它是否达到我想要的目标。如果您能对此有所启发,我也将不胜感激。更新#2
根据this,看来
KieBuilder
可能会有所帮助。所以您认为:KieFactory kf = KieFactory.Factory.get();
KieFileSystem kfs = kf.newKieFileSystem();
KieBuilder kb = ks.newKieBuilder(kfs);
kb.setDependencies(someKieModule, someOtherKieModule);
kb.build();
KieContainer kContainer = ks.getKieContainer(kr.getDefaultGAV());
会工作?
最佳答案
这是从多种资源中构建KieBase的基本动作序列。
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
FileInputStream fis = new FileInputStream( "simple/simple2.drl" );
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newInputStreamResource( fis ) );
FileInputStream fis1 = new FileInputStream( "simple/simple.dsl" );
kfs.write( "src/main/resources/simple.dsl",
kieServices.getResources().newInputStreamResource( fis1 ) );
FileInputStream fis2 = new FileInputStream( "simple/simple.dslr" );
kfs.write( "src/main/resources/simple.dslr",
kieServices.getResources().newInputStreamResource( fis2 ) );
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();