<div dir="ltr">Hi Mario,<div><br></div><div>I figured out this is a problem with Event and dynamic salience. Suppose we have the following declarations and rules:<br><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
declare Message<br> @role(event)<br>end<br><br>rule "rule1"<br>salience RuleSalience.RULE1<br>when<br> $m : Message()<br>then<br> System.out.println("====================> rule1");<br> retract($m);<br>
RuleSalience.RULE1 = RuleSalience.RULE2 - 1;<br>end <br><br>rule "rule2"<br>salience RuleSalience.RULE2<br>when<br> $m : Message()<br>then<br> System.out.println("=====================> rule2");<br>
retract($m);<br> RuleSalience.RULE2 = RuleSalience.RULE1 - 1;<br>end <br><br></blockquote>I want when a Message is inserted, either rule1 or rule2 is fired. I also want two rules can fire alternatively. So when one rule is fired, its salience becomes lower. </div>
<div><br></div><div>The result is, if I don't declare Message as an Event, it works fine. Otherwise, only rule1 is fired. </div><div><br></div><div>The problem seems to be at org.drools.core.reteoo.LeftInputAdapterNode::doInsertSegmentMemory(). Because of stream mode, both rules are not inserted StagedLeftTuples. So rule1 and rule2 are not compared based on salience. Because rule1 has a smaller act#, it is always fired first. </div>
<div><br></div><div>The attached zip is a test case. If you want mvn clean test, it will fail. However, if you remove the following lines from Sample.drl, the test will succeed. </div><div><br></div><div>"declare Message<br>
@role(event)<br>end"<br></div><div><br></div><div>Thanks.</div><div><br></div><div>Jinghai</div></div>