[rules-users] 回复: how to ensure that one rule only is executed once?

yong zhao cluncao at yahoo.com.cn
Fri Mar 18 21:42:10 EDT 2011


thanks , Both are possible ways for the issue though they are a little 
complicated.



________________________________
发件人: Michael Anstis <michael.anstis at gmail.com>
收件人: Rules Users List <rules-users at lists.jboss.org>
发送日期: 2011/3/19 (周六) 12:25:48 上午
主   题: Re: [rules-users] how to ensure that one rule only is executed once?

You'd need to make sure you inform the engine that Order's price has changed:-

when
    ...
then
    modify( $o ) {
        setPrice( $o.getPrice() - 20);
    }

You could also consider using agenda-groups or lock-on-active to provide your 
behaviour.

agenda-groups

rule "rule 1"
//implied default agenda-group of MAIN
when
    $o : Order (amount>100 && <200);
then
    modify( $o ) {
        setPrice( $o.getPrice() - 10);
    }
    drools.setFocus("next step in calculation");
end

rule "rule 2"
//implied default agenda-group of MAIN
when
    $o:Order (amount>200);
then
    modify( $o ) {
        setPrice($o.getPrice() - 20);
    }
    drools.setFocus("next step in calculation");
end

rule "rule 3"
agenda-group "next step in calculation"
when
    $o : Order(....)
then
    ....
end

lock-on-active

rule "rule 1"
//implied default agenda-group of MAIN
lock-on-active true
when
    $o : Order (amount>100 && <200);
then
    modify( $o ) {
        setPrice( $o.getPrice() - 10);
    }
end

rule "rule 2"
//implied default agenda-group of MAIN
lock-on-active true
when
    $o:Order (amount>200);
then
    modify( $o ) {
        setPrice($o.getPrice() - 20);
    }
end

rule "rule 3"
agenda-group "next step in calculation"
when
    $o : Order(....)
then
    ....
end


On 18 March 2011 16:08, Gabor Szokoli <szocske at gmail.com> wrote:

Hi,
>
>>From what I know, it's generally better to make the rules idempotent:
>In your case introduce a discountedPrice field, leaving the original
>price alone.
>
>If you insist on making it run only once instead, you can introduce a
>field or fact class to mark an order "discounted", then all
>discounting rules know to ignore it. (This gets really complicated if
>the order amount ever changes and you do need to run the discounting
>rules again.)
>
>
>Gabor
>
>2011/3/18 yong zhao <cluncao at yahoo.com.cn>:
>
>> Hi
>> I just try to uses jboss rules in our projects. I met a question. for
>> example
>> package sample
>> rule "rule 1"
>> when
>>   $o:Order (amount>100 and amount<200);
>>  then
>> $o.setPrice($o.getPrice()-10);
>> end
>> rule "rule 2"
>> when
>>   $o:Order (amount>200);
>>  then
>> $o.setPrice($o.getPrice()-20);
>> end
>> if the fact , order's amount is 210. then the rule2 will be executed, then
>> the rule1 will be fired . I want to stop the session once some rule is
>> executed or how to control the rule flow.
>> thanks in advance
>> -Yong
>>
>>
>>
>>
>> _______________________________________________
>> 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
>



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110319/977d5adc/attachment.html 


More information about the rules-users mailing list