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

标签 java drools kie

我有一组字符串形式的规则,它们作为参数传递给我的函数,该函数不存储在任何文件中。从我到目前为止读到的内容来看,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 有一个索引,您可以在其中查找方法和类型名称。接口(interface)是

org.kie.api.KieServices 
org.kie.api.builder.KieFileSystem
org.kie.api.io.KieResources
org.kie.api.io.Resource

Javadoc:“KieFileSystem 是一个内存文件系统,用于...”要了解它的工作原理,请查看源代码。

关于java - 如何从 Drools 6.5 中的字符串加载规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42927331/

相关文章:

java - Drools 规则语言 : rule not always fired

java - Jboss 流口水抛出错误无法分析 boolean 变量的表达式

java.lang.ClassNotFoundException : org. eclipse.aether.resolution.ArtifactResolutionException

java - Failed to notify project evaluation listener 错误在 Android Studio

java - 在java中生成螺旋矩阵的算法

java - 为什么 Java 8 有 Arrays.parallelSort() 但没有 Collections.parallelSort()?

eclipse - Drools Eclipse Workbench 的问题

java - 如何在 jbpm 任务的数据分配 I/O 中调用 getter 方法?

java - jBPM 和 JPA 事务管理器 : no local transaction to join

Java 如何使用系统类加载器(无 URLClassLoader)从类路径中的 jar 中加载类?