Spring Drool接受更新的规则

Spring Drool接受更新的规则,spring,drools,drools-guvnor,Spring,Drools,Drools Guvnor,我希望将业务逻辑与web应用程序分开(SpringMVC+Hibernate),以获得更好的可维护性,并且我不希望为了业务逻辑的更改而重新启动服务器。如果我修改DRL文件以进行业务更改,drool引擎会选择最新的DRL吗 我做了一个测试应用程序,但是更新的DRL文件没有加载到“KnowledgeBase”中。有没有办法在Drools引擎中加载更新的DRL/规则而不重新启动服务器 Account.java public class Account { private Integer balance

我希望将业务逻辑与web应用程序分开(SpringMVC+Hibernate),以获得更好的可维护性,并且我不希望为了业务逻辑的更改而重新启动服务器。如果我修改DRL文件以进行业务更改,drool引擎会选择最新的DRL吗

我做了一个测试应用程序,但是更新的DRL文件没有加载到“KnowledgeBase”中。有没有办法在Drools引擎中加载更新的DRL/规则而不重新启动服务器

Account.java

public class Account {
private Integer balance;
   // setter & getter
}
和测试程序has:

    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为

规则“低于限制”
什么时候
美元账户:账户(余额<700)
然后
System.out.println(“通知用户”);
end

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


有关详细信息,请参见“使用变更集的配置知识库”及其后续章节。在这里重复这一切实在太多了。

6.x现在让这变得简单多了。它基于maven版本控制。容器(包含运行时位)可以在jar的任何版本中启动。然后还可以使用updateToVersion方法将其更新为jar的任何版本。最后,kie ci使用maven版本更新标准,为自动更新和来自外部maven存储库的解析提供嵌入式maven支持。

您必须使用
KieScanner
来实现这一点。以下是文档中的引用:

KieScanner允许连续监视Maven存储库 检查是否已安装Kie项目的新版本。A. 新版本部署在包装该项目的容器中。这个 使用KieScanner需要
kie ci.jar
位于类路径上

您还可以使用
ks.scanNow()

记住在构建项目时检查增量版本,因为drools将检查是否存在该工件的任何新版本。如果是,则它将仅在运行时交换

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 );