Java 如何从Drools 6.5中的字符串加载规则

Java 如何从Drools 6.5中的字符串加载规则,java,drools,kie,Java,Drools,Kie,我有一组字符串形式的规则,这些规则作为参数传递给我的函数,它不存储在任何文件中。从我到目前为止所读到的内容来看,对于6之前的版本,有很多解决方案,我猜API是非常不同的。(他们建议使用6.5中不推荐使用的KnowledgeBase) 这是我目前的解决方案: KieFileSystem kfs = kService.newKieFileSystem(); Resource drlResource = ResourceFactory.newByteArrayResource(rules.getByt

我有一组字符串形式的规则,这些规则作为参数传递给我的函数,它不存储在任何文件中。从我到目前为止所读到的内容来看,对于6之前的版本,有很多解决方案,我猜API是非常不同的。(他们建议使用6.5中不推荐使用的KnowledgeBase)

这是我目前的解决方案:

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

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代码中隐藏着一个简单的示例,它也向您展示了如何做到这一点——它帮助我让它正常工作:

很抱歉,我找不到这个。
kfs.write()
会在该位置创建临时文件吗?它是如何工作的?我没有使用maven,而不是“src/main/resources/simple.drl”,如果我使用“src/main/rules/abc.drl”(任何用户定义的路径),它的语法正确吗?在我的情况下,它没有抛出任何错误,相反,它甚至没有执行规则。我被困在问题中,请帮助。@NamrataChoudhary的评论不是用来问新问题的。在您自己的问题中显示规则和Java代码。您可以在以下url@laune中找到完整的工作项目。我发现规则是在内存中创建的。有没有办法把它归档?