I’m having a strange issue with drools :
I have the following rules :
rule "is my dog a baby?"
ruleflow-group "dog"
salience 10
when
dog : Dog(age <1 )
then
dog.setIsBaby(true);
end
rule "baby dog"
ruleflow-group "dog"
salience 9
when
myData : MyData( myDog.isBaby() == false)
then
System.out.println(myData.getMyDog().getIsBaby());
end
I insert in my session myData and myData.getMyDog(), where myData.getMyDog.isBaby==false
The first rule is fired and my dog is set to be a baby. Then the second one is fired, and even it prints true .(even if the condition was to be false)
And when I test after firing all rules , myDog in myData is set to be a baby .
What am I doing wrong here ? Why does the second rule is fired ? is the problem in the session (stateful in my case) ?
I think that I need to say that I modify myData:myDog somewhere ,but I am not sure where .
Hope my question is clear, if not tell me.
When you modify working memory facts, you need to tell Drools that the data has changed so it can re-evaluate all relevant rules.
Drools evaluates facts before firing any matched rules. If you have a dog with age = 0 and baby = false, both your rules will be activated. When your
is my dog a baby?rule is fired, it doesn’t change the fact that when Drools evaluated thebaby dogrule, themyDog.isBaby() == falsecondition was true.To inform Drools that you have modified some fact, use the
update()knowledge helper method. Keep in mind that Drools associates fact handles to a specific object. If a rule referencesMyData, and you want that rule to be re-evaluated when theMyData.myDogobject has changed, you’ll need to useupdate()on theMyDataobject; just doingupdate()on yourDogobject, will not cause thebaby dogrule to be re-evaluated.Try changing your
is my dog a baby?rule to the following: