Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新加载口水规则而不重新启动_Java_Drools_Kie - Fatal编程技术网

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我要测试:)