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 );
}
}
}
それが役に立てば幸い。