如何将多个 KieModules 部署到单个 KieBase 中

How to deploy multiple KieModules into a single KieBase

我正在研究将由多个 Maven 工件表示的多个 KieModule 部署到单个 KieContainer 中的方法。这是我的要求:

  1. 用户定义规则,打包,
  2. 他们将软件包安装在 Maven 存储库中,
  3. 他们使用 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

到目前为止,我所能看到的是 KieContainerKieModule 之间存在一对一的关系。这是真的?我也知道我可以将我的工件分组在父工件下并在每次更新时部署它,但我不想强制我的业务用户将他们的工件分组(因为这也会使他们依赖于每个其他)。

我也乐于接受关于如何实现这一目标的替代建议(也许有多个 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();