如何将多个KieModule部署到单个KieBase

时间:2017-05-12 22:02:56

标签: java spring maven drools jbpm

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

  1. 用户定义规则,打包它们,
  2. 他们将包安装在Maven仓库
  3. 他们使用RESTful api通知Spring应用程序部署了一些groupId,artifactId和version(在请求体中)的新规则,因此应用程序可以选择新的KieModule并添加它到KieContainer
  4. 基本上最棒的是:

    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 个答案:

答案 0 :(得分:2)

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