有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将多个KieBase模块部署到单个KieBase中

我正在研究如何将由多个Maven工件表示的多个KieModule部署到单个KieContainer中。以下是我的要求:

  1. 用户定义规则,打包规则
  2. 他们在Maven repo上安装软件包
  3. 它们使用RESTful api通知Spring应用程序,有一些新规则部署了groupId、artifactId和version(在请求体中),因此应用程序可以选择新的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());

行吗


共 (1) 个答案

  1. # 1 楼答案

    这是从大量资源构建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();