如何在运行时从Guvnor加载和执行规则(无更改集xml文件)

cst*_*rtz 2 java drools

我想提供一个包和规则名称,从Guvnor检索该规则并运行它.我想在不预先定义change-set.xml文件中的任何资源的情况下执行此操作.我无法在网上找到任何此类示例或作为任何drools文档的一部分.

目前,我只是想弄清楚如何将规则纳入我的应用程序.所以..

给定Guvnor中特定规则的包和规则名称,如何在运行时将该规则导入我的应用程序(以便它适用于在应用程序启动后创建的规则)?

谢谢!

Eds*_*lli 6

Drools的架构面向包装,而不是单个规则.虽然您可以在加载过程中过滤掉规则,但我不建议您这样做.您应该将规则分开到不同的包中,或者使用启用或议程过滤器等规则属性来逻辑禁用规则.

话虽如此,您可以直接使用KnowledgeAgent或KnowledgeBuilder来加载远程包.Guvnor对包的URL使用标准命名约定.该URL将是:

<guvnor-url>/org.drools.guvnor.Guvnor/package/<your_pkg_name>/<version>
Run Code Online (Sandbox Code Playgroud)

因此,例如,如果您的名称包名称是"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
Run Code Online (Sandbox Code Playgroud)

使用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() );
Run Code Online (Sandbox Code Playgroud)

以上将把整个包加载到您的知识库中.如果您确实想要加载单个规则(不推荐),则可以在添加到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 );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.