[rules-users] rule with low Salience is fired too early

Wolfgang Laun wolfgang.laun at gmail.com
Sun May 17 16:04:10 EDT 2009


For repeated changes of a fact (the Score thing, in your case) a stateful
session should be used. Then, the update of your Score fact would be

   modify( s ){
      setValue( s.getValue() + 4 )  // 4 or whatever
   }

Repeated firing of the "threshold" rule is due to the Engine's reassessment
of your Score fact after each increment, irrespective of its value field
being below or above the threshold. Therefore, firing happens after each
change above the limit.

You could reduce this to a single firing by adding another boolean field
"alerted" which is set to true in the RHS of this rule and included in the
rule's LHS:
when
   s : Score( value > 40, alerted == false )
then
   modify( s ){
       setAlerted( true )
   }

-W


On Sun, May 17, 2009 at 7:27 PM, David Boaz <davidb at dbmotion.com> wrote:

>
> Dear all,
>
> First, let me inform that we are using stateless sessions in Drools 5 CR1.
> In my application I have to compute a score and if the score is above a
> threshold, an alert is created.  The score is accumulated from many small
> rules (actually, generated from excel using drools decision-tables).
>
> Initially, many input objects and a Score object initialized to zero are
> inserted. The form of my rules is:
>
> 1       rule “accumulate #1”
> 2               when
> 3                       Input(....)
> 4                       s:Score()
> 5               then
> 6                       s.add(4) // 4 is just an example
> 7       end
> 8
> 9       rule “threshold”
> 10              when
> 11                      Score(value>40)
> 12              then
> 13                      Alert.create(..)
> 14      end
>
> 1.The Score object was actually accumulated as expected. But for some
> reason, the “threshold” rule fired once when the score.value was still ==0.
> 2.I tried to set the salience of the “threshold” rule to -1 (low priority).
> But it didn't affect the rule firing.
> 3.I suspected that the engine was not informed that the score object was
> updated in the first rules. So, I added a call to drools.update(s) after
> line 6. That solved the issue and the “threshold” rule actually fired. But
> now, I noticed that several alerts were created because the score was set
> several times to a value>40.
> 4.To solve that new issue, I set again the salience of the threshold rule
> to
> -1. This time, only one alert was created.
>
> My concern is that I don't understand what happened. Can someone please
> explain?
>
> To my understanding, the situation described in my second bullet should
> work. Initially, all the inserted objects are checked in the RETE network
> and an agenda is created. The activation for the “threshold” rule is the
> last one. I don't see the reason how can the threshold rule fire before all
> the accumulate rules were fired.
>
> Thanks for the help, David
> --
> View this message in context:
> http://www.nabble.com/rule-with-low-Salience-is-fired-too-early-tp23585593p23585593.html
> Sent from the drools - user mailing list archive at Nabble.com.
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090517/686a20ee/attachment.html 


More information about the rules-users mailing list