3

こんにちは、別の drools ルールのセットが起動したときに、他の drools ルールの起動を無効にしたいのですが、どうすればよいですか?

アジェンダ グループ "Daily" があるとします。これには 2 セットの drools ルール セット A にはルール "Default-1"、"Default-2"、"Default-3" があり、セット B にはルール "Custom-1"、"カスタム-2」、「カスタム-3」

アジェンダ グループ「Daily」がフォーカスされ、現在のファクトがカスタム パターンと一致する場合、「Custom-1」および/または「Custom-2」および/または「Custom-3」のみを起動します。それ以外の場合、「Default-1」および/または「Default-2」および/または「Default-3」のみが起動します。

問題は、Default-1/2/3 が常に起動されることです。Custom-1/2/3 でそれらを無効にする方法が必要です。まず、Custom-1/2/3 の顕著性レベルを Default-1/2/3 より高く設定します。次に、アクティベーショングループを使用しようとしました。しかし、それらすべてを同じアクティベーション グループに設定すると、6 つのルールのうち 1 つだけが実行されます。これは私が望んでいることではありません。

毎回すべてのルールをロードする .java モジュールを変更することはできません。.drl drools ルールのみを変更できます。

ありがとうございました。

4

2 に答える 2

6

マーカー オブジェクトを使用して問題を解決してみてください。Marker クラスを定義するとします。

public class Marker {
    String uniqueIdentifier;
    //getter and setter, etc
}

(drools を使用すると、*.java に頼らずに *.drl コードで新しいクラスを定義できます)
次に、カスタム グループをデフォルト グループの前に実行し (salience が機能し、フローの定義も機能します)、それらのオブジェクトに「マーク」を付けます。カスタム ルールは、次のような新しいマーカー ファクトをメモリに挿入することによってトリガーされました。

when
   SomeObject($unique: someIdentifier)
   //normal conditions
then
   insert(new Marker($unique))
   //normal action

また、デフォルト ルールの は、カスタム ルールが起動されていないオブジェクトにのみ作用します。

when
   SomeObject($unique: someIdentifier)
   not Marker(uniqueIdentifier = $unique)
   //normal conditions
then
   //normal action

また、これがリークするのを防ぐために、クリーンアップするために 3 番目 (最後) のルールのグループが必要になる場合があります。

when
   SomeObject($unique: someIdentifier)
   $marker : Marker(uniqueIdentifier = $unique)
then
   retract($marker)
于 2013-01-11T06:40:22.217 に答える
1

この種の動作に対する Drools のサポートは、Declarative Agendaを使用して存在します。

基本的に、次のコンテキスト メソッドを提供します。

void blockMatch(Match match);
void unblockAllMatches(Match match);
void cancelMatch(Match match);

他のルールをブロックしているルールが残っているtrueか、実際には明示的にブロック解除されている間に、ルール内から他のルールをブロックすること。

于 2016-02-02T00:30:57.393 に答える