我正在研究将由多个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


到目前为止,我所能看到的是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();

10-01 19:07