我想提供一个包和规则名称,从 Guvnor 检索该规则并运行它。我想在没有在 change-set.xml 文件中预先定义任何资源的情况下完成这一切。我无法在网上或任何 drools 文档中找到任何此类示例。
目前,我只是想弄清楚如何将规则放入我的应用程序中。所以..
给定 Guvnor 中特定规则的包和规则名称,我如何在运行时将该规则导入我的应用程序(以便它适用于应用程序启动后创建的规则)?
谢谢!
Drools 的架构面向包,而不是单独的规则。尽管您可以在加载过程中过滤掉规则,但我不建议您这样做。相反,您应该将不同包中的规则分开,或者使用启用或议程过滤器等规则属性在逻辑上禁用规则。
话虽如此,您可以直接使用 KnowledgeAgent 或 KnowledgeBuilder 来加载远程包。Guvnor 对包的 URL 使用标准命名约定。URL 将是:
<guvnor-url>/org.drools.guvnor.Guvnor/package/<your_pkg_name>/<version>
因此,例如,如果您的名称包名称是“some.pkg”,并且您已将 guvnor 部署到 jboss AS 7 中的本地实例,则 URL 可能是:
http://localhost:8080/guvnor-5.4.0.Final-jboss-as-7.0/org.drools.guvnor.Guvnor/package/some.pkg/LATEST
使用 KnowledgeBuilder,您可以:
// load package
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newUrlResource( "http://localhost:8080/guvnor-5.4.0.Final-jboss-as-7.0/org.drools.guvnor.Guvnor/package/some.pkg/LATEST" ),
ResourceType.PKG );
// create the knowledge base
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
// add the package to the kbase
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
以上会将整个包加载到您的知识库中。如果您真的想加载单个规则(不推荐),您可以在添加到 kbase 之前从包中删除其他规则:
for( KnowledgePackage kpkg : kbuilder.getKnowledgePackages() ) {
// need to clone the rule references for iteration
Collection<Rule> rules = new ArrayList<Rule>( kpkg.getRules() );
for( Rule rule : rules ) {
if( ! RULE_YOU_WANT.equals( rule.getName() ) ) {
// NOT recommended as you are using internal APIs
((KnowledgePackageImp)kpkg).removeRule( rule );
}
}
}
希望能帮助到你。