如何将多个 KieModules 部署到单个 KieBase 中
How to deploy multiple KieModules into a single KieBase
我正在研究将由多个 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();
我正在研究将由多个 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();