在运行时动态地从 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());
我是 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());