[jboss-jira] [JBoss JIRA] (DROOLS-164) Rule do not fire when lock-on-active true present
Davide Sottara (JIRA)
jira-events at lists.jboss.org
Mon Sep 9 02:44:03 EDT 2013
[ https://issues.jboss.org/browse/DROOLS-164?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12802645#comment-12802645 ]
Davide Sottara commented on DROOLS-164:
---------------------------------------
Citing the Drools Expert guide:
"Whenever a ruleflow-group becomes active or an agenda-group receives the focus, any rule within that group that has lock-on-active set to true will not be activated any more; irrespective of the origin of the update, the activation of a matching rule is discarded".
When you insert the fact, both rules become active. Rule 1 then fires first because of the higher salience. When it modifies the Tradebooking AFTER setting the action (notice that it is a key attribute!), two things happen: a new activation (with an effectively new TradeHeader) is tentatively generated, but rejected because of the lock-on-active; the previous activation is cancelled because its supporting facts no longer hold. Finally, the String blocks a new activation of Rule 1.
- Removing salience 1 lets Rule2 fire before Rule1, so the latter does not have the time to cancel the former
- Removing the setAction() causes Rule2 to re-activate "in place". Since the new facts are equals, the engine does not try to replace the activation with a new one. So lock-on-active does not apply (correctly)
- Removing the modify of course prevents any re-evaluation and tentative reactivation of Rule2
- Removing lock-on-active prevents the blocking effect.
So, the engine behaves correctly. You should reconsider modifying an attribute when it's a key, or find alternatives to lock-on-active such as property reactivity.
Please let me know if you need more explanations.
The ticket should be rejected.
Best
Davide
> Rule do not fire when lock-on-active true present
> -------------------------------------------------
>
> Key: DROOLS-164
> URL: https://issues.jboss.org/browse/DROOLS-164
> Project: Drools
> Issue Type: Bug
> Security Level: Public(Everyone can see)
> Affects Versions: 5.5.0.Final
> Environment: Win7/64 Java6
> Reporter: Sergey Alaev
> Assignee: Mark Proctor
>
> Given following rules:
> 1 rule "Rule1"
> 2 salience 1
> 3 when
> 4 $booking: TradeBooking()
> 5 $trade: TradeHeader() from $booking.getTrade()
> 6 not (String())
> 7 then
> 8 $trade.setAction("New");
> 9 modify($booking) {}
> 10 insert ("run");
> 11 end;
> 12
> 13 rule "Rule2"
> 14 lock-on-active true
> 15 when
> 16 $booking: TradeBooking( )
> 17 $trade: Object( ) from $booking.getTrade()
> 18 then
> 19
> 20 end
> and instance of TradeBooking() object with booking.trade != null
> i expect to get: Rule1 fired, Rule2 fired
> but i get: Rule1 fired
> I can get expected result if i comment out one of the following lines: 2, 8, 9, 14
> I was unable to reproduce this issue using standard mutable class (java.util.Date), so there are some details:
> TradeBooking, TradeHeader are interfaces, instances are generated using JDK proxy.
> $booking.getTrade() returns JDK Proxy over interface that inherits TradeHeader.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list