[rules-users] Adding @PropertyReactive causes the other rules removed from the stack
Mark Proctor
mproctor at codehaus.org
Fri Dec 20 10:14:45 EST 2013
I turned your code into a unit test and added it to the 6.0 codebase. see the method “testModifyAfterInsertWithPropertyReactive” in the commit:
https://github.com/droolsjbpm/drools/commit/53ca46d3b
It works for PHREAK and RETE mode. Everything works for 6.0, we’ll try it against 5.6.CR1 soon
Mark
On 20 Dec 2013, at 09:14, Sonata <plz.write.to at gmail.com> wrote:
> Davide Sottara wrote
>> The goal of @propertyReactive is exactly to prevent rules from refiring
>> on a modify, based on what properties are constrained or @watched.
>> This is irrelevant with respect to the order of the rules.
>> This may or may not be a bug, we'd need to see the rules.
>> Davide
>
> Example attached
>
> ReactiveTest.java
> package com.sample;
> import org.drools.KnowledgeBase;
> import org.drools.KnowledgeBaseFactory;
> import org.drools.builder.KnowledgeBuilder;
> import org.drools.builder.KnowledgeBuilderFactory;
> import org.drools.builder.ResourceType;
> import org.drools.io.ResourceFactory;
> import org.drools.logger.KnowledgeRuntimeLogger;
> import org.drools.logger.KnowledgeRuntimeLoggerFactory;
> import org.drools.runtime.StatefulKnowledgeSession;
> public class ReactiveTest {
> public static final void main(String[] args) {
> KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
> ResourceType.DRL);
> KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
> kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
> StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
> ksession.insert(new MyClass());
> ksession.fireAllRules();
> }
> }
>
> MyClass.java
> package com.sample;
> import org.drools.definition.type.PropertyReactive;
> @PropertyReactive
> public class MyClass {
> private String value;
> public String getValue() { return value; }
> public void setValue(String value) { this.value = value; }
> }
>
> Sample.drl
> package com.sample;
> rule "1"
> when MyClass(value == null)
> then System.out.println("Rule 1 fired");
> end
>
> rule "2"
> when m : MyClass(value == null)
> then modify(m) { setData("test") }
> end
>
> rule "3"
> when MyClass(value == null)
> then System.out.println("Rule 3 fired");
> end
>
> So you can see from the example, rule "1", rule "2" and rule "3" are all
> added to the stack ready to be fired.
> Rules are then fired starting from the bottom, where rule "3" fired and then
> rule "2" fired. But rule "1" is being removed from the stack after rule "2"
> has fired, which is a mystery to me.
>
> Try to remove modify(m) to just m.setData("test") in rule "2", all three
> rules fired.
>
> So I agree to your "prevent rules from refiring", but this case is not even
> fired yet.
>
>
>
> --
> View this message in context: http://drools.46999.n3.nabble.com/Adding-PropertyReactive-causes-the-other-rules-removed-from-the-stack-tp4027374p4027382.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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20131220/238654db/attachment.html
More information about the rules-users
mailing list