drools - 我需要使用 Kie 文件系统为动态生成的 DRL 文件实施 Drool Fluent API 的帮助
问题描述
我成功地使用drool fluent api动态生成了drool文件。但是我的问题是我无法使用KieFileSystem API将这个文件写入内存区域。这导致运行时异常找不到kie模块。下面是相同的
包 com.nagarro;
全局 fact.OutputData 输出;
当 GenericEvent(cost>500)然后 output.setDiscount(10) 结束时规则“rule1”
线程“主”java.lang.RuntimeException 中的异常:在 org.drools.compiler.kie.builder.impl.KieServicesImpl.newKieContainer(KieServicesImpl.java:97) 处找不到 KieModule:org.default:artifact:1.0.0-SNAPSHOT在 main.Launcher.evaluate(Launcher.java:67) 在 main.Launcher.main(Launcher.java:58)
我已经使用 drool 验证器验证了 drl 文件的结构。
下面是我用于相同的代码。
public class Launcher {
public static void main(final String[] args) throws Exception {
/* PackageDescr pkg = DescrFactory.newPackage()
.name("org.drools.example").newImport().target("java.util.ArrayList").end()
.newImport().target("java.util.ArrayList").end()
.newImport().target("java.util.Vector").end()
.newRule().name("alert")
.lhs()
.and()
.pattern("Foo").id( "$foo", false ).constraint("bar==baz").constraint("x>y").end()
.not().pattern("Bar").constraint("a+b==c").end().end()
.end()
.end()
.rhs("System.out.println;"+"/n"+"System.out.println;").end()
.getDescr();*/
PackageDescr desc2 = DescrFactory
.newPackage()
.name("com.nagarro;")
.newGlobal().type("fact.OutputData").identifier("output;")
.end()
.newRule().name("rule1")
.lhs()
.pattern("GenericEvent").constraint("cost>500")
.end()
.end()
.rhs(" output.setDiscount(10)")
.end()
.getDescr();
DrlDumper dumper=new DrlDumper();
String drl=dumper.dump(desc2);
System.out.print(drl);
// verify(drl);
evaluate(drl, new OrderEvent());
}
static private void evaluate(final String drl, final Event event) throws Exception {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
kieFileSystem.write("src/main/resources/rule.drl", drl);
kieServices.newKieBuilder(kieFileSystem).buildAll();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
StatelessKieSession statelessKieSession = kieContainer.getKieBase().newStatelessKieSession();
//HashMap<String,Object> outputMap = new HashMap<>();
OutputData outData = new OutputData();
statelessKieSession.getGlobals().set("output", outData);
HashMap<String, Object> inputMap = new HashMap<>();
inputMap.put("price", 1000);
GenericEvent evt = new GenericEvent();
evt.setInputmap(inputMap);
evt.setCost(1000);
statelessKieSession.execute(evt);
System.out.println(outData.getDiscount());
}
public static void verify(final String drl) {
// Create verifier builder [1]
VerifierBuilder vBuilder = VerifierBuilderFactory.newVerifierBuilder();
// Create verifier [2]
Verifier verifier = vBuilder.newVerifier();
// Add Resources you want to verify [3]
verifier.addResourcesToVerify(new ClassPathResource("generic.drl",Launcher.class),
ResourceType.DRL );
// Run the verification rules [4]
verifier.fireAnalysis();
// Get the result object [5]
VerifierReport result = verifier.getResult();
System.out.println(result);
// Print the the errors [6]
for(VerifierMessageBase base: result.getBySeverity( Severity.ERROR ) ){
System.out.println( base );
}
}
}
解决方案
要将 drl 写入文件,请使用:
kieFileSystem.write("src/main/resources/rule2.drl", kieServices.getResources().newReaderResource(
new StringReader(drl)));
用于验证 drl
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
// check there have been no errors for rule setup
Results results = kieBuilder.getResults();
if (results.hasMessages(Message.Level.ERROR)) {
System.out.println(results.getMessages());
throw new IllegalStateException("### errors ###");
}
KieContainer kieContainer = kieServices.newKieContainer( kieBuilder.getKieModule().getReleaseId());
KieSession kieSession = kieContainer.newKieSession();
对于评估规则:
kieSession.insert(inputData);
kieSession.setGlobal("output", outData);
kieSession.fireAllRules();
kieSession.dispose();
推荐阅读
- android - 无法解析 gradle 的外部依赖
- r - 我如何将符号转换为颜色编码闪亮的应用程序
- anylogic - 当行人使用anylogic进入时,如何从PedSource设置速度后在退出期间更改行人的速度?
- python - 无法在 python 中使用 selenium 在网页中加载“显示更多”?
- http - 有没有办法为多个 http 请求设置令牌?
- r - 使用列表列或嵌套 data.frame 测试小标题的相等性
- python - 保存多个数据,没有重复数据 sqlite sqlachemy flask
- c# - 需要如何使用 TransactionScope 修复“Ora-02048”
- go - 如何构建程序作为测试的一部分
- shell - 在没有环境变量的情况下运行 qsub 时在 shell 上打印使用情况