Drools 知识库已弃用

Posted

技术标签:

【中文标题】Drools 知识库已弃用【英文标题】:Drools KnowledgeBase Deprecated 【发布时间】:2014-07-10 04:22:13 【问题描述】:

我正在将 Drools 规则引擎集成到我的应用程序中。我发现的 99% 的入门示例如下所示:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newUrlResource( url ),
                      ResourceType.DRL );
if ( kbuilder.hasErrors() ) 
    System.err.println( builder.getErrors().toString() );
                     

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( builder.getKnowledgePackages() );

StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
ksession.insert( new Fibonacci( 10 ) );
ksession.fireAllRules();

ksession.dispose();

我有类似的工作,但我的问题是KnowledgeBase 被标记为已弃用,这对我来说是一个危险信号,我做错了。现在KnowledgeBaseFactory.newKnowledgeBase() 没有被标记为弃用,但它也返回一个KnowledgeBase 类型。

既然知识库已被弃用,那么我应该使用什么?

【问题讨论】:

您使用的是哪个版本?自 Drools 6 以来,发生了很多变化,所以这可能是罪魁祸首? @DaDaDom 是 6.0.1.Final。我认为是这种情况,但如果 drools doc(pdf 文件)使用知识库,我无法找到替代方案。 【参考方案1】:

这是我发现可用于 6.x 的代码:

    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    FileInputStream fis = new FileInputStream( pathToSomeDrl );
    kfs.write( "src/main/resources/simple.drl",
                kieServices.getResources().newInputStreamResource( fis ) );
    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) )
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    
    KieContainer kieContainer =
        kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
    KieBase kieBase = kieContainer.getKieBase();
    KieSession kieSession = kieContainer.newKieSession();

KnowledgeBase 的引用仍保留在文档中,但它确实已被弃用。

【讨论】:

谢谢,我想这是有道理的。我只是在最新的文档中找不到任何指向我的东西。 应该 `KieSession kieSession = kieContainer.newKieSession();` 是 `KieSession kieSession = kieBase.newKieSession();` ? 两者都可以。如果您不必为 KieBase 指定配置,请使用较短的。 这段代码很有用——我希望它在正确的文档中——但我仍然缺少的是如何在 6 API 中注册自定义评估器,而不使用已弃用的 API。我找到了这个 - 但最终的海报没有说明如何做到这一点......drools.46999.n3.nabble.com/… 是的,这很有用。重要的是要注意,对于 v6.2.0(可能还有 6.x 系列中的其他版本),您必须在 kds.write(...) 调用的路径前添加“src/main/resources/”。未能做到这一点,我的所有测试都未能在稍后执行规则时找到 DRL。

以上是关于Drools 知识库已弃用的主要内容,如果未能解决你的问题,请参考以下文章

Drools:无状态与有状态知识会话

Drools 规则取决于来自 JDK Map 的知识(不在非 JDK 类中)

PHP 已弃用:each() 函数已弃用 [重复]

已弃用:指令 'allow_url_include' 在第 0 行的 Unknown 中已弃用

Modernizr.load 已弃用。 Yepnope.js 已弃用。怎么办?

UIAlertView 已弃用:首先在 iOS 9.0 中弃用 - UIAlertView 已弃用。将 UIAlertController 与首选样式一起使用