简而言之,我想在运行时从规则存储库中创建、编辑和删除规则。我无法弄清楚如何在 drools 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);
}
}
我使用 Guava资源类。
关于java - 在 Drools 6 中以编程方式创建新的 drools 规则的新接受方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27570431/