如何从 Drools 6.5 中的字符串加载规则
How to load rules from a string in Drools 6.5
我有一组字符串形式的规则,它们作为参数传递给我的函数,不存储在任何文件中。到目前为止,根据我的阅读,对于 6 之前的版本有很多解决方案,我猜这些 API 非常不同。 (他们建议使用 KnowledgeBase,它在 6.5 中已弃用)
这是我目前的解决方案:
KieFileSystem kfs = kService.newKieFileSystem();
Resource drlResource = ResourceFactory.newByteArrayResource(rules.getBytes());
drlResource.setResourceType(ResourceType.DRL);
kfs.write(drlResource);
KieBuilder builder = kService.newKieBuilder(kfs).buildAll();
但是当我 运行 时,抛出错误提示:
java.lang.RuntimeException: Resource does not have neither a source nor a target path. Impossible to add it to the bundle. Please set either the source or target name of the resource before adding it.ByteArrayResource[bytes=[105, 109, 112, 111, 114, 116, 32, 106, 97, 118, ...], encoding=null]
at org.drools.compiler.kie.builder.impl.KieFileSystemImpl.write(KieFileSystemImpl.java:95)
但是我这里没有源文件,如何将字符串转换为规则资源?
我正在使用 Drools 6.5。0.Final。
你可能会用到这个:
String drl = "...";
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newReaderResource( new StringReader(drl) ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
它就在 Drools 中 API - 只需找到它即可。
编辑
Javadoc 有一个索引,您可以在其中查找方法和类型名称。接口是
org.kie.api.KieServices
org.kie.api.builder.KieFileSystem
org.kie.api.io.KieResources
org.kie.api.io.Resource
Javadoc:"The KieFileSystem is an in-memory file system used to ..."要了解其工作原理,请查看源代码。
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
kSession.insert(createCommlObject());
如果您按照 Laune 的回答中提到的那样执行 buildAll(),kie 模块将加载所有 .drl 文件。如果您想加载您选择的 .drl 文件,请使用
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL);
GitHub 上的 Drools 代码中隐藏了一个简单的示例,该示例还向您展示了如何执行此操作 - 它帮助我使其正常工作:
KieFileSystem example on GitHub
我有一组字符串形式的规则,它们作为参数传递给我的函数,不存储在任何文件中。到目前为止,根据我的阅读,对于 6 之前的版本有很多解决方案,我猜这些 API 非常不同。 (他们建议使用 KnowledgeBase,它在 6.5 中已弃用)
这是我目前的解决方案:
KieFileSystem kfs = kService.newKieFileSystem();
Resource drlResource = ResourceFactory.newByteArrayResource(rules.getBytes());
drlResource.setResourceType(ResourceType.DRL);
kfs.write(drlResource);
KieBuilder builder = kService.newKieBuilder(kfs).buildAll();
但是当我 运行 时,抛出错误提示:
java.lang.RuntimeException: Resource does not have neither a source nor a target path. Impossible to add it to the bundle. Please set either the source or target name of the resource before adding it.ByteArrayResource[bytes=[105, 109, 112, 111, 114, 116, 32, 106, 97, 118, ...], encoding=null]
at org.drools.compiler.kie.builder.impl.KieFileSystemImpl.write(KieFileSystemImpl.java:95)
但是我这里没有源文件,如何将字符串转换为规则资源?
我正在使用 Drools 6.5。0.Final。
你可能会用到这个:
String drl = "...";
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newReaderResource( new StringReader(drl) ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
它就在 Drools 中 API - 只需找到它即可。
编辑 Javadoc 有一个索引,您可以在其中查找方法和类型名称。接口是
org.kie.api.KieServices
org.kie.api.builder.KieFileSystem
org.kie.api.io.KieResources
org.kie.api.io.Resource
Javadoc:"The KieFileSystem is an in-memory file system used to ..."要了解其工作原理,请查看源代码。
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
kSession.insert(createCommlObject());
如果您按照 Laune 的回答中提到的那样执行 buildAll(),kie 模块将加载所有 .drl 文件。如果您想加载您选择的 .drl 文件,请使用
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL);
GitHub 上的 Drools 代码中隐藏了一个简单的示例,该示例还向您展示了如何执行此操作 - 它帮助我使其正常工作: KieFileSystem example on GitHub