重新加载Drools规则而不重新启动

时间:2018-02-26 09:16:19

标签: java drools kie

我有一个运行Java版本的Drools 7.4.1.Final个应用,其中包含.drl个文件及其规则。我的应用程序允许在运行时生成新的.drl文件,或修改当前的.drl文件。

我想运行这个新的drl文件而不再重新启动我的应用。我知道如果我再次重新启动,它会加载新版本的规则文件,但我想避免停止执行应用程序。我的应用程序是.jar应用程序,我使用java -jar命令运行。在下面的代码中,CTES.Rules包含带有.drl文件的文件系统。

有可能吗?

我附加了用于加载规则文件的代码:

private void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    kfs.write(ResourceFactory.newFileResource(new File(CTES.RULES)));
    KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
    KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
    KieSessionConfiguration conf=  SessionConfiguration.newInstance();
    kSession = kieContainer.newKieSession(conf);
    if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
        List<Message> errors = kieBuilder.getResults().getMessages(Message.Level.ERROR);
        StringBuilder sb = new StringBuilder("Errors:");
        for (Message msg : errors) {
            sb.append("\n  " + msg);
        }
        throw new Exception(sb.toString());
    }

    System.out.println("KieServices built: ");
}

更新 我读过有关KieScanner和KieModule的文章。但我不清楚如何在我的应用中添加新版本或如何使用KieScanner。

我必须在此代码中更改以允许加载新版.drl文件(在CTES.RULES中)而不停止我的应用程序?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用KieScanner动态加载规则。 KieScanner使用本地maven存储库来动态加载KieModule。  您将获得详细信息here

答案 1 :(得分:0)

发布最新解决方案 - 我们正在使用带有 Spring Boot、Spring Cloud 配置的 drools,我们能够在运行时使用 /actuator/refresh 端点和 @kiecontainer bean 上的 @refreshscope 重新加载规则。

我们有如下 yml:

rules:
    app1:
      program1:
          rulesetkbasename
          rulesetkbasepackage
          rulesetfilelocation
          rulesetfiles
          rulesetKsessionname
    app2:
      program2:
          rulesetkbasename
          rulesetkbasepackage
          rulesetfilelocation
          rulesetfiles
          rulesetKsessionname