2011-10-13 6 views
12

を支配しますルールは解雇され、私の犬は赤ちゃんになる予定です。それでは、2番目のルールが実行され、それでもtrueが出力されます(条件が偽であっても)。Droolsのは、私はDroolsの持つ奇妙な問題を抱えている流れ

すべてのルールを実行した後にテストすると、myDataのmyDogは赤ちゃんに設定されます。

私はここで間違っていますか?なぜ第2のルールは解雇されるのですか?セッション(私の場合はステートフル)の問題ですか?

私はmyData:myDogをどこかで変更すると言いたいと思いますが、どこがわからないのですか?

私の質問は私には分かりませんが、私には明らかです。あなたはあなたの最初のルールに

then 
    dog.setIsBaby(true); 
    update(dog) 

を行うと、Droolsのができるよう

when 
    dog : Dog(isBaby == false) 
    myData : MyData(myDog == dog) 

のようなあなたの二番目のルールのルールは、このように書かなければならないときを書き直す必要が

答えて

15

ワーキングメモリファクトを変更する場合は、関連するすべてのルールを再評価できるように、データが変更されたことをDroolsに伝える必要があります。

Droolsは、一致するルールを実行する前にファクトを評価します。年齢= 0、赤ちゃん=偽の犬がいる場合は、両方のルールが有効になります。 is my dog a baby?ルールが実行されたとき、Droolsがbaby dogルールを評価したときにmyDog.isBaby() == false条件が真だったという事実は変更されません。

あなたが事実を変更したことをDroolsに知らせるには、update()ナレッジヘルパーメソッドを使用してください。 Droolsはファクトハンドルを特定のオブジェクトに関連付けます。ルールがMyDataを参照していて、MyData.myDogオブジェクトが変更されたときにそのルールを再評価したい場合は、を追加する必要があります。MyDataオブジェクトでupdate()を使用する必要があります。 Dogオブジェクトにupdate()を実行しても、baby dogルールの再評価は行われません。

を次のようにあなたのis my dog a baby?ルールを変更してみてください:

rule "is my dog a baby?" 
    ruleflow-group "dog" 
    salience 10 
    when 
     dog : Dog(age < 1, baby == false) 
     myData : MyData(myDog == dog) 
    then 
     dog.setIsBaby(true); 
     update(dog); 
     update(myData); 
    end 
+0

多くの私はそれを試みるつもりです –

9

ファクトが変更された後で再度実行する必要のあるルールを自動的に検出します。

ルールエンジンでファクトを変更するたびに、更新して変更したことを作業メモリに伝える必要があります。

私はバージョン4以降のdroolsを使用していませんが、これはまだ適用されているものとします。

+0

たくさん私はそれを試してみようとしている –

2

はいあなたは犬とマップの両方を更新する必要があります。 乾杯

0

modifyまたはupdateナレッジヘルパーメソッドを使用して作業メモリ内の犬を更新することができます。上記の関数のいずれかが可能なら、Droolsはルールを再評価し、無限ループに終わります。あなたはまた、あなたにあなたのルールで無ループ属性を必要とするか、それが再び同じルールを評価し、何度も何度もtrueにisBabyは更新されません次回ようにあなたが

dog : Dog(age <1, isBaby == false)

に条件変更します。

関連する問題