在Drools 6中以编程方式创建新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代码创建和管理规则。

我想要一个比.rrl文件的字符串模板更好的方法来创建新规则和修改规则。 从Java以编程方式创建新规则的用途是什么? 我做了很多搜索,但似乎无法为此找到一组Java API调用。

我不知道这是否是’接受’的方式,但是使用以下代码我在Drools 6中使用编程创建的规则来编辑.drl文件。

 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 Resources类。

从Java代码构建规则没有稳定的 API。 当然,DRL编译器的解析器有一个API,但它不稳定,并且与DRL规则语法一样复杂,这是相当可观的。

XML是一种选择,其中至少左手边的语法足够简单,以5.2(IIRC)结束。 现在,您可以使用Java的完整表达式语法等,并结合构建CE的多种方式。

如果您的规则非常简单,您可能会想出一个可以使用可管理API进行操作的规则模型。 否则,最好的选择是文本编辑器(当然还有Kie Workbench)。

以编程方式创建规则的内置方法基于“Descr”流畅的API,它直接操纵编译器的AST,绕过解析器。

请参阅类org.drools.compiler.lang.api.DescrFactory

和类org.drools.compiler.lang.DrlDumper从AST中检索DRL近似值。