Java Drools 6.0 在运行时动态加载规则

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23542610/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 23:45:24  来源:igfitidea点击:

Drools 6.0 dynamically load rules at runtime

javadrools

提问by Aidan

I want to load a drl file at runtime. The posts I've found including this onework for version 5.0 but I can't figure out how to do it for drools version 6.0.

我想在运行时加载一个 drl 文件。我发现的帖子包括这一篇适用于 5.0 版,但我不知道如何为 Drools 6.0 版做到这一点。

回答by Steve

In Drools 6, your rules packages are deployed to Maven. A KieScanner is provided, which you can attach to your KieContainer. This polls your repository at a defined interval to see whether a package has been updated and downloads the latest if that's the case.

在 Drools 6 中,您的规则包被部署到 Maven。提供了一个 KieScanner,您可以将其附加到您的 KieContainer。这会以定义的时间间隔轮询您的存储库,以查看软件包是否已更新,如果是,则下载最新的。

A full explanation of how to define a KieScanner (including code samples) is provided in the Drools documentation here:

Drools 文档中提供了如何定义 KieScanner(包括代码示例)的完整说明:

https://docs.jboss.org/drools/release/latest/drools-docs/html/ch04.html

https://docs.jboss.org/drools/release/latest/drools-docs/html/ch04.html

回答by danidemi

I used info taken from those two docs:

我使用了从这两个文档中获取的信息:

I've came out with this snippet that loads rules defined in the /drl/file/pathfile into the stateful session you obtain at the last line.

我提出了这个片段,它将/drl/file/path文件中定义的规则加载到您在最后一行获得的有状态会话中。

    File path = new File("/drl/file/path");
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newFileResource(path), ResourceType.DRL);
    if (kbuilder.hasErrors()) {
        throw new RuntimeException("Errors: " + kbuilder.getErrors());
    }
    kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

Some methods are deprecated, so, don't expect this solution to be valid in the following releases.

不推荐使用某些方法,因此,不要指望此解决方案在以下版本中有效。

Please, double check the imports, they are all from org.kie, not from droolspackages. I admit those imports are too much, but I'm pasting the code from an example I'm trying to develop, so I have more things on my code, sorry for that.

请仔细检查导入,它们都来自org.kie,而不是来自drools包。我承认这些导入太多了,但是我正在粘贴我正在尝试开发的示例中的代码,所以我的代码中有更多内容,抱歉。

import java.io.File;

导入 java.io.File;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieScanner;
import org.kie.api.builder.ReleaseId;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.conf.EqualityBehaviorOption;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;

Hope it helps.

希望能帮助到你。

回答by Claude

You have a how-to of what you're looking for in Drools 6: http://oncodesign.io/2015/08/10/dynamically-create-rules-using-drools--rule-templates/

你有你在 Drools 6 中寻找什么的操作方法:http: //oncodesign.io/2015/08/10/dynamically-create-rules-using-drools--rule-templates/