我有一个运行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
中)而不停止我的应用程序?
由于
答案 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