Drool采用更新的规则

时间:2014-12-07 10:57:42

标签: spring drools drools-guvnor

我希望将业务逻辑与Web应用程序(spring MVC + Hibernate)分开以获得更好的可维护性,我不想重新启动服务器以进行业务逻辑更改。如果我修改DRL文件以进行业务变更,流口水引擎会选择最新的DRL吗?

我做了一个测试应用程序,但更新后的DRL文件未加载到知识库中#39;。有没有办法在不重启服务器的情况下在Drools引擎中加载更新的DRL /规则?

Account.java

public class Account {
private Integer balance;
   // setter & getter
}

测试程序ha s:

    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("myrule.drl"), ResourceType.DRL);
    KnowledgeBase kbase = kbuilder.newKnowledgeBase();

    StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
    Account account = new Account(1000);
    account.withdraw(500);
    ksession.execute(account);

DRL

rule "belowLimit" when $account : Account( balance < 700 ) then System.out.println("Notify user"); end

3 个答案:

答案 0 :(得分:1)

Drools 5.x版本(正如您显然使用的)功能更改集定义了要监视更改的目录或文件,以便自动重建知识库,此后启动的会话可能反映新的知识库。

Detaiks可以在文档中找到&#34;使用变更集配置知识库&#34;及其继任者。在这里重复这一切真的太过分了。

答案 1 :(得分:0)

6.x现在使这更加简单。它基于maven版本控制。 KieContainer(包含运行时位)可以在任何版本的jar中再次启动。然后,您可以使用updateToVersion方法将其更新为任何版本的jar。最后,kie-ci使用maven版本更新标准为外部maven存储库提供自动更新和解析的嵌入式maven支持。 http://docs.jboss.org/drools/release/6.0.0.Final/drools-docs/html/KIEChapter.html#BuildDeployUtilizeAndRunSection

答案 2 :(得分:0)

您必须使用KieScanner来实现。这是文档中的报价:

  

KieScanner允许连续监视您的Maven存储库   检查是否已安装新版本的Kie项目。一种   新版本已部署在包装该项目的KieContainer中。的   使用KieScanner要求kie-ci.jar位于类路径上。

KieServices kieServices = KieServices.Factory.get();
ReleaseId releaseId = kieServices.newReleaseId( "org.acme", "myartifact", "LATEST" );
KieContainer kContainer = kieServices.newKieContainer( releaseId );
KieScanner kScanner = kieServices.newKieScanner( kContainer );

// Start the KieScanner polling the Maven repository every 10 seconds
kScanner.start( 10000L );

您也可以使用ks.scanNow()

记住,以检查增量版本来构建您的项目,因为流口水将检查该工件是否存在任何新版本。如果是,那么它将仅在运行时交换。