9

DroolsとDroolsGuvnorのプロジェクトを始めています。

私のルールはdroolsguvnorにデプロイされています。私のルールエンジンインスタンスは、パッケージリリースのビルドとリリースを行うときにdroolsGuvnorによって公開されたpkgファイルを介してこれらのルールにアクセスできます。

これはすべて正常に機能しています。私が探しているのは、実行時にルールを無効にするためのソリューションです。

私が今持っている唯一の解決策は、guvnorに行き、ルールをアーカイブし、そのルールを含むパッケージのビルドとリリースを行うことです。

別の戦略はありませんか?

4

2 に答える 2

7

要件とアーキテクチャに応じて、これを解決する方法はいくつかあります。

  • 1つの方法は、ルールの各サブセットを異なるguvnorパッケージで定義することです。kbaseをビルドするときは、特にそのkbaseに必要なルールを含むパッケージのみをロードできます。

  • もう1つの方法は、常にすべてのルールをロードすることですが、「有効」式を使用して、ルールを動的に有効/無効にします。この場合のルールは引き続き評価されますが、アクティブ化されないようにすることができます。これは、セッションに挿入したファクトに基づいてルールを有効/無効にする場合に便利な手法です。例えば:

    ルールXenabled()then..。

    上記のブール式は、ルールの条件、ルール属性、アノテーションから変数バインディングにアクセスできます。また、DRLの外部でルールをアクティブ化する条件を定義する場合は、ヘルパークラスの静的メソッドにもアクセスできます。ファイル。

  • これを行う3番目の方法は、アジェンダフィルターを使用することです。この場合、すべてのルールをロードし、ファクトを使用してセッションを作成し、ルールを実行するときにアジェンダフィルターを使用します。アジェンダフィルターは、自分で実装したり、Droolsに付属しているフィルターの一部を使用したりできるインターフェイスです。フィルタは、各ルールを実行する前に呼び出され、拒否するか、エンジンにルールの実行を許可します。この場合、すべてのルールが評価されてアクティブ化されますが、フィルターが実行を許可するルールのみが実行されることに注意してください。たとえば、名前が「X」で始まるルールのみを実行する場合は、次のコード行を使用できます。

    ksession.fireAllRules(new RuleNameStartsWithAgendaFilter( "x"));

    詳細については、次のインターフェースを参照してください。

    https://github.com/droolsjbpm/droolsjbpm-knowledge/blob/master/knowledge-api/src/main/java/org/drools/runtime/rule/AgendaFilter.java

    ドキュメントは次のとおりです(トピック3.3.3.4.1までスクロールダウンします)。

    http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/index.html#d0e2792

于 2012-06-01T16:13:09.657 に答える
1

作業メモリー内のファクトの存在に条件を追加できます。何かのようなもの:

rule "RuleA"
when
  not( RuleADisabled() )
  ....
then
  ....
end

Javaコードでルールを無効にします。

ksession.insert( new RuleADisabled() );
于 2012-05-31T22:48:39.067 に答える