【问题标题】:How to load rules from a string in Drools 6.5如何从 Drools 6.5 中的字符串加载规则
【发布时间】:2023-03-11 06:35:01
【问题描述】:

我有一组字符串形式的规则,它们作为参数传递给我的函数,它不存储在任何文件中。从我目前阅读的内容来看,对于 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。

【问题讨论】:

    标签: java drools kie


    【解决方案1】:
    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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你可以使用这个:

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

        【讨论】:

        • 很抱歉我找不到这个。 kfs.write() 会在该位置创建一个临时文件吗?它是如何工作的?
        • 我没有使用 maven,而不是 "src/main/resources/simple.drl" ,如果我使用的是 "src/main/rules/abc.drl" (任何用户定义的路径),它是正确的语法吗?在我的情况下,它没有抛出任何错误,相反它甚至没有执行规则。我遇到了问题,请帮忙。
        • @NamrataChoudhary 评论不是用来提出新问题的。在您自己的问题中显示规则和 Java 代码。
        • 您可以在以下网址找到完整的工作项目github.com/pandiyan90/spring-boot-drools
        • @laune 我发现该规则是在内存中创建的。有什么办法可以把它放到一个文件中?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多