[rules-users] Adding eval on rule cause it to run in infinite loop

Mark Proctor mproctor at codehaus.org
Thu Jun 12 07:20:35 EDT 2014


Davide is correct, for our analysis to work, the constraint must not be inside an eval, and any constraint that does not start with a field name is internally rewritten as an eval.

Mark
On 11 Jun 2014, at 18:48, Davide Sottara <dsotty at gmail.com> wrote:

> I think I know what is happening here.
> I assume your supportFT class is @propertyReactive.
> (btw, you should follow bean conventions and capitalize class names)
> Looking at Rule 1, you don't set the value directly, but you do it through
> a modify. Your rule 2, which checks for the value, uses the function
> "containsAny"
> rather than the field direclty as in "value IN (..)".
> At the moment, the engine has no way to realize that the function
> involves the field "value" - I'm not even sure it is possible in general -
> Property reactivity will ignore the update since, from its perspective, none
> of the fields relevant to the rule has been affected, hence rule 2 will
> not hit.
> If you use eval in the constraint, property reactivity is disabled, so
> the rule
> WILL fire the first time, but now you are vulnerable to infinite loops,
> as if
> you did not have propertyreactive.
> You may have to use the @watch() annotation explicitly to control which
> modifies will cause reevaluations and which ones won't (see the manual
> for this)
> Adding "eval" everywhere is not a good idea.
> Best,
> Davide
> 
> 
> 
> 
> 
> On 06/11/2014 01:53 PM, brachi wrote:
>> example of rule that doesn't work without eval:
>> 
>> /*    rule "1"
>>    salience -1
>>    agenda-group "agenda1"
>>    when
>>        $conclusion: supportFT()
>>    then
>> 		if($conclusion.getValue()==null){
>> 			modify($conclusion) { setValue(new ArrayList())};
>> 		}
>> 		$conclusion.getValue().add("supportedValue");
>>                modify($conclusion) { setValue($conclusion.getValue()) };
>>     end
>> 
>> 
>>    rule "2"
>>    salience -2
>>    agenda-group "agenda2"
>>    when
>>        supportFT(Operators.containsAny(value,new
>> String[]{"supportedValue","otherValue"}))  
>> 		$conclusion: ConclusionFt()
>>    then
>> 		modify($conclusion){setValue("success")};
>>    end*/
>> 
>> rule "2" doesn't hit, works only with eval in rule "2".
>> in this example I can add eval, because the Fact Types model is different,
>> so the rule doesn't reevaluated.
>> because I had this case, I decided to add eval for all constraints, but
>> unfortunately I had an infinite loop. 
>> 
>> 
>> 
>> 
>> --
>> View this message in context: http://drools.46999.n3.nabble.com/Adding-eval-on-rule-cause-it-to-run-in-infinite-loop-tp4029966p4029984.html
>> Sent from the Drools: User forum mailing list archive at Nabble.com.
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>> 
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users




More information about the rules-users mailing list