Pet*_*ith 10 java rules drools drools-guvnor
简而言之,我想在运行时从规则库创建,编辑和删除规则.我很难弄清楚如何在流氓6+中做到这一点.
我知道在先前版本的drools(<= 5.6)中,有一个.drl文件的XML表示和一个用于它的API:https://docs.jboss.org/drools/release/5.6.0 .Final/drools-expert-docs/html/ch04.html#d0e8052.
从5.6开始的drools文档表明这个已弃用,它似乎在6处被完全删除.我不想使用已知没有直接升级路径的API.
由于工作流程要求以及Web用户界面的复杂性,将Guvnor或Workbench UI公开给用户进行规则编辑也不太合适.我想从Java代码创建和管理规则.
我想要一个比.drl文件的字符串模板更好的方法来创建新规则和修改规则.从Java以编程方式创建新规则的用途是什么?我做了很多搜索,但似乎无法为此找到一组Java API调用.
我不知道这是否是"接受"的方式,但是使用以下代码我.drl在Drools 6中以编程方式创建规则来编辑文件.
public KieContainer build(KieServices kieServices) {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
ReleaseId rid = kieServices.newReleaseId("com.example.rulesengine",
"model-test", "1.0-SNAPSHOT");
kieFileSystem.generateAndWritePomXML(rid);
kieFileSystem.write("src/main/resources/rules.drl",
getResource(kieServices, "rules.drl"));
addRule(kieFileSystem);
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) {
throw new RuntimeException("Build Errors:\n" +
kieBuilder.getResults().toString());
}
return kieServices.newKieContainer(rid);
}
private void addRule(KieFileSystem kieFileSystem) {
PackageDescrBuilder packageDescrBuilder = DescrFactory.newPackage();
packageDescrBuilder
.name("com.example.model")
.newRule()
.name("Is of valid age")
.lhs()
.pattern("Person").constraint("age < 18").end()
.pattern().id("$a", false).type("Action").end()
.end()
.rhs("$a.showBanner( false );")
.end();
String rules = new DrlDumper().dump(packageDescrBuilder.getDescr());
kieFileSystem.write("src/main/resources/rule-1.drl", rules);
}
private Resource getResource(KieServices kieServices, String resourcePath) {
try {
InputStream is = Resources.getResource(resourcePath).openStream(); //guava
return kieServices.getResources()
.newInputStreamResource(is)
.setResourceType(ResourceType.DRL);
} catch (IOException e) {
throw new RuntimeException("Failed to load drools resource file.", e);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的是Guava Resources类.
没有稳定的API 用于从 Java 代码构建规则。当然,DRL 编译器的解析器有一个 API,但它不稳定,并且像 DRL 规则语法一样复杂,这是相当大的。
XML 是一个选项,至少左侧语法足够简单,最终以 5.2 (IIRC) 结束。现在,您可以使用 Java 的完整表达式语法等,并结合多种不同的方式来组成 CE。
如果您的规则非常简单,您可能会提出一个可以使用可管理的 API 进行操作的规则模型。否则,最好的选择是文本编辑器(或者当然是 Kie Workbench)。