如何从Drools 6.5

时间:2017-03-21 12:35:38

标签: java drools kie

我有一组String形式的规则,它们作为参数传递给我的函数,它不存储在任何文件中。从我到目前为止所读到的,对于6之前的版本有很多解决方案,我猜测API非常不同。 (他们建议使用知识库,在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)

但我这里没有源文件,如何将String转换为规则资源?

我正在使用Drools 6.5.0.Final。

3 个答案:

答案 0 :(得分:1)

您可以使用此:

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:" KieFileSystem是一个内存文件系统,用于..."要了解它是如何工作的,请查看源代码。

答案 1 :(得分:0)

KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");
        kSession.insert(createCommlObject());

kie模块将加载所有.drl文件。如果您想要加载选择.drl,请使用

 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL);

答案 2 :(得分:0)

在GitHub的Drools代码中隐藏着一个简单的示例,该示例还向您展示了如何执行此操作-它帮助我使其正常工作: KieFileSystem example on GitHub