Java 重新加载口水规则而不重新启动
我有一个Java 重新加载口水规则而不重新启动,java,drools,kie,Java,Drools,Kie,我有一个JavaDrools应用程序运行7.4.1.Final版本,有一个.drl文件及其规则。我的应用程序允许在运行时生成新的.drl文件,或修改当前的.drl文件 我想运行这个新的drl文件,而不需要重新启动我的应用程序。我知道如果我再次启动,它会加载新版本的规则文件,但我希望避免停止应用程序的执行。我的应用程序是一个.jar应用程序,我使用java-jar命令运行它。在下面的代码中,CTES.Rules包含带有.drl文件的文件系统 可能吗 我附加用于加载规则文件的代码: private
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: ");
}
private void build()引发异常{
KieServices=KieServices.Factory.get();
KieFileSystem kfs=kieServices.newKieFileSystem();
write(ResourceFactory.newFileResource(新文件(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 errors=kieBuilder.getResults().getMessages(Message.Level.ERROR);
StringBuilder sb=新的StringBuilder(“错误:”);
对于(消息消息消息:错误){
sb.追加(“\n”+msg);
}
抛出新异常(sb.toString());
}
System.out.println(“构建的服务:”);
}
更新
我读过KieScanner和KieSmodule。但我不清楚如何在我的应用程序中加入新发布的内容,也不清楚如何使用KieScanner
为了允许加载新版本的.drl
文件(在CTES.RULES
中),而不停止我的应用程序,我必须对此代码进行哪些更改
谢谢您可以使用KieScanner动态加载规则。KieScanner使用本地maven存储库动态加载KieScanner模块。
您将获得最新解决方案的详细信息-我们将drools与Spring boot、Spring cloud config一起使用,我们能够在运行时使用@kiecontainer bean上的@refreshscope的/actuator/refresh endpoint重新加载规则 我们的yml如下所示:
rules:
app1:
program1:
rulesetkbasename
rulesetkbasepackage
rulesetfilelocation
rulesetfiles
rulesetKsessionname
app2:
program2:
rulesetkbasename
rulesetkbasepackage
rulesetfilelocation
rulesetfiles
rulesetKsessionname
我正在读这篇文章,我不知道如何在我的项目中使用KieScanner或KieJar。我的文件系统中有一个drl文件,我从应用程序中读取它。另外,我的应用程序是一个.jar,我使用java-jar命令运行:(KieContainer使用kmodule.xml加载kiebase。按照以下步骤操作:1.将Drl文件和事实从Kieseision程序中分离出来。然后执行
mvn安装
使用artifactId
、groupId
和版本创建KieContainer。然后从KieContainer中创建KieScanner我可以如何分离m我的KieSession中是否有DRL文件?如果您安装了我们项目的mvn
,项目jar将根据groupId
,artifactId
和version
编写代码,如:KieServices=KieServices.Factory.get();ReleaseId rs=ks.newReleaseId(“artifactId”、“groupId”、“version”);KieContainer KieContainer=ks.newKieContainer(rs);KieScanner KieScanner=ks.newKieScanner(KieContainer);KieScanner.start(10000);
KieScanner每10秒扫描一次本地maven repo我要测试:)