Hi all!

 

I noticed problems when using retract in rules. Thereby, I get sometimes NullPointerExceptions like this (Drools Version 6.0.0.Beta1):

Exception executing consequence for rule "rule 6 - ts filter" in test: java.lang.NullPointerException

                at org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)

                at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1409)

                at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1328)

                at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1546)

                at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:637)

                at org.drools.core.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:601)

                at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:233)

                at test.DroolsMain.insertEvent(DroolsMain.java:50)

                at test.EventSender.run(EventSender.java:73)

                at java.lang.Thread.run(Thread.java:722)

Caused by: java.lang.NullPointerException

                at org.drools.core.util.index.LeftTupleIndexHashTable.remove(LeftTupleIndexHashTable.java:381)

                at org.drools.core.reteoo.NotNode.retractLeftTuple(NotNode.java:301)

                at org.drools.core.reteoo.CompositeLeftTupleSinkAdapter.doPropagateRetractLeftTuple(CompositeLeftTupleSinkAdapter.java:261)

                at org.drools.core.reteoo.CompositeLeftTupleSinkAdapter.propagateRetractRightTuple(CompositeLeftTupleSinkAdapter.java:172)

                at org.drools.core.reteoo.JoinNode.retractRightTuple(JoinNode.java:181)

                at org.drools.core.reteoo.ObjectTypeNode.retractObject(ObjectTypeNode.java:344)

                at org.drools.core.reteoo.EntryPointNode.retractObject(EntryPointNode.java:406)

                at org.drools.core.common.NamedEntryPoint.delete(NamedEntryPoint.java:591)

                at org.drools.core.base.DefaultKnowledgeHelper.retract(DefaultKnowledgeHelper.java:429)

                at test.Rule_rule_6___ts_filter247591339.defaultConsequence(Rule_rule_6___ts_filter247591339.java:18)

                at test.Rule_rule_6___ts_filter247591339DefaultConsequenceInvokerGenerated.evaluate(Unknown Source)

                at test.Rule_rule_6___ts_filter247591339DefaultConsequenceInvoker.evaluate(Unknown Source)

                at org.drools.core.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1399)

                ... 8 more

 

 

Or, using Drools 5.5.1-SNAPSHOT

Exception executing consequence for rule "rule 3 - remove start stop fact" in test: java.lang.NullPointerException

                at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)

                at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1291)

                at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1215)

                at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1450)

                at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710)

                at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674)

                at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230)

                at test.DroolsMain.insertEvent(DroolsMain.java:50)

                at test.EventSender.run(EventSender.java:73)

                at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.NullPointerException

                at org.drools.base.DefaultKnowledgeHelper.retract(DefaultKnowledgeHelper.java:419)

                at test.Rule_rule_3___remove_start_stop_fact.defaultConsequence(Rule_rule_3___remove_start_stop_fact.java:8)

                at test.Rule_rule_3___remove_start_stop_factDefaultConsequenceInvokerGenerated.evaluate(Unknown Source)

                at test.Rule_rule_3___remove_start_stop_factDefaultConsequenceInvoker.evaluate(Unknown Source)

                at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1281)

                ... 8 more

 

 

The problematic rules mostly look something like this:

rule "rule 6 - ts filter"

  agenda-group "evaluation"

 

  when

    $evtA : Event(type == EventType.START) from entry-point "InputStream"

    $evtB : Event(type == EventType.START, this after $evtA, this != $evtA, senderId == $evtA.senderId) from entry-point "InputStream"

  then

    //do something

    //...

    retract($evtA);

end

 

The exception does not immediately occur. Sometimes it occurs sooner, sometimes it takes longer until it occurs. When the exception is thrown, it looks like that the event is not removed from the knowledge base (I watch the number of events in the knowledge base – fact count). I made the experience that this problem only occurs when the rule file grows (e.g. when there are more than 10 rules to execute) and when the load increases. To work temporarily around this problem, I set the java process to use only 1 processor in the windows task manager – which looks like this is a multi threading issue.

I can reproduce this exception with the Drools versions 5.5.0, 5.5.1-SNAPSHOT and 6.0.0.Beta1. I did not test the previous versions explicitly.

 

Please find attached a small dummy test application to reproduce this problem. Execute therefore the main method from the class “test.DroolsMain”. Depending on your machine and load, the problem occurs sometimes sooner or sometimes later. Or, you might notice some other exception, but the problem when retracting events or facts is currently the biggest one in my productive applications.

 

Best regards,

Wolfgang