在运行时动态地从 drool 文件中选择更改 |没有行家

Dynamicaly pick the change from drool file at runtime | without maven

我是 Drool 的新手,如果我在下面犯了任何愚蠢的错误,请原谅我。我目前正在开发一个基于 Ant 的应用程序(迁移到 Maven 是一个高风险)。我正在尝试将 drool 版本从 4.0.7 升级到 6.5.0。我想在 java 代码运行时动态获取 .drl 文件的更新版本,这样我就不需要每次都构建 java 文件。这是我下面的代码。

DroolsPoc.java

package com.test;



import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.kie.api.KieServices;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;

public class DroolsPoc {

    private static AtomicBoolean isRulesChangeScanerStarted = new AtomicBoolean(
            false);

    public static void main(String[] args) throws InterruptedException {

        Map<String, Object> input = new HashMap<String, Object>();

        input.put("input", new Dto());

        KieServices ks = KieServices.Factory.get();

        KieFileSystem kfs = ks.newKieFileSystem();
        kfs.write(ResourceFactory.newFileResource(new File("C:/Users/workspace1/Drools_POC/src/poc.drl")));
        ks.newKieBuilder(kfs).buildAll();

        KieContainer kieContainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId());

        KieSession kieSession = kieContainer.newKieSession();
        kieSession.insert(input);
        System.out.println("Fired all rules 1");
        kieSession.fireAllRules();

        System.out.println(((Dto) input.get("input")).getName());

        Thread.currentThread().sleep(20000);

        /*The updated rule should get printed by below code*/
        KieSession kieSession1 = kieContainer.newKieSession();
        kieSession1.insert(input);
        System.out.println("Fired all rules 2");
        kieSession1.fireAllRules();

        System.out.println(((Dto) input.get("input")).getName());

    }

}

Dto.java

package com.test;

public class Dto {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

poc.drl

import java.util.Map;
import java.util.HashMap;
import com.test.Dto;


function Boolean checkIfNull(Map input){

  Dto dto = (Dto)input.get("input");

  if (null == dto.getName()){
      return true;
  }

      return false;

}


function void setName(Map input){

  Dto dto = (Dto)input.get("input");

  dto.setName("The moon is out");

}

rule "PopulateNameInDto"
dialect "mvel"
when
    map : HashMap() eval
    (
    checkIfNull(map)
    )
then
    setName(map);
end

代码 运行 很好,唯一的问题是,当线程休眠 20 秒时,在 DroolsPoc.java 文件的第 Thread.currentThread().sleep(20000); 行,然后我正在更新 poc.drl 文件从 "The moon is out""The sun is out"。所以我期待这个变化反映程序何时在睡眠后再次运行。

任何帮助将不胜感激,非常感谢。

如果您想让更改显示出来,我担心您不仅需要重做 KieSession。

sleep(..) 之后,您可能需要重做第

行的所有内容
ks.newKieBuilder(kfs).buildAll();

看来我必须重新创建服务对象并再次导入文件。 可行,但这种方式不是最优的。

Thread.currentThread().sleep(20000);
Map<String, Object> input1 = new HashMap<String, Object>();
input1.put("input", new Dto());
KieServices ks1 = KieServices.Factory.get();
KieFileSystem kfs1 = ks1.newKieFileSystem();

kfs1.write(ResourceFactory.newFileResource(new File(
        "C:/Users/workspace1/Drools_POC/src/poc.drl")));
ks1.newKieBuilder(kfs1).buildAll();
KieContainer kieContainer1 = ks.newKieContainer(ks.getRepository()
        .getDefaultReleaseId());

KieSession kieSession1 = kieContainer1.newKieSession();
kieSession1.insert(input1);
System.out.println("Fired all rules 1");

kieSession1.fireAllRules();
System.out.println(((Dto) input1.get("input")).getName());