3

パッケージとルール名を指定して、Guvnor からそのルールを取得して実行したいと思います。change-set.xml ファイルでリソースを事前に定義せずに、これをすべて実行したいと思います。この例をオンラインで、または Drools のドキュメントの一部として見つけることができません。

現在、私は自分のアプリケーションにルールを適用する方法を考え出すことに固執しています。そう..

Guvnor の特定のルールのパッケージ名とルール名が与えられた場合、そのルールを実行時にアプリケーションにインポートするにはどうすればよいですか (アプリケーションの起動後に作成されたルールで機能するようにするため)。

ありがとう!

4

1 に答える 1

7

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

上記により、パッケージ全体がナレッジ ベースに読み込まれます。代わりに 1 つのルールを本当にロードしたい場合 (推奨されません)、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 );
        }
    }
}

それが役に立てば幸い。

于 2012-06-19T14:27:23.890 に答える