<p>Thanks Wolfgang. I&#39;ll change over to the 5.3 libraries and carry on with my testing. I&#39;ll also enter this issue into jira if it doesn&#39;t yet exist. </p>
<p>Sincerely, <br>
Jason </p>
<div class="gmail_quote">On May 14, 2013 11:30 AM, &quot;Wolfgang Laun&quot; &lt;<a href="mailto:wolfgang.laun@gmail.com">wolfgang.laun@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Looks like a bug in Drools to me. It has the classic hallmark of a<br>
race condition: the NPE does not happen with every run (on my system),<br>
perhaps only with 85%.<br>
<br>
Moreover, with 5.4.0 I get a similar NPE and also:<br>
Exception in thread &quot;main&quot; java.util.NoSuchElementException<br>
        at java.util.LinkedList.remove(LinkedList.java:788)<br>
        at java.util.LinkedList.removeFirst(LinkedList.java:134)<br>
        at org.drools.common.PropagationContextImpl.evaluateActionQueue(PropagationContextImpl.java:344)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:342)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:298)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:123)<br>
        at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:53)<br>
        at overrun.Main.main(Main.java:64)<br>
<br>
5.3.0 is the last version without this bug.<br>
<br>
-W<br>
<br>
<br>
On 14/05/2013, jpbarto &lt;<a href="mailto:Jason.P.Barto@gmail.com">Jason.P.Barto@gmail.com</a>&gt; wrote:<br>
&gt; First the specifics: JDK 1.6, Mac OSX, using Drools 5.5 Final<br>
&gt;<br>
&gt; The full source code and rules are pasted below but here&#39;s the gist, I have<br>
&gt; a stateful knowledge session to which I am inserting events and running an<br>
&gt; accumulate on the input events.  I have a for loop generating the events<br>
&gt; and<br>
&gt; inserting them as rapidly as possible.  In the rules I use an accumulator<br>
&gt; to<br>
&gt; calculate the average of the values contained within the events.  The<br>
&gt; behavior I&#39;m observing is that if I insert ~120 events without any waiting<br>
&gt; I<br>
&gt; receive an NPE.  If I Thread.sleep for even just 1ms the test goes off<br>
&gt; without a hitch.  Have I uncovered a bug which should be logged in JIRA?  I<br>
&gt; would check through JIRA to see if something similar has been logged but<br>
&gt; I&#39;m<br>
&gt; so unfamiliar with the codebase, not to mention it could all just be user<br>
&gt; error.<br>
&gt;<br>
&gt; The NPE is as follows:<br>
&gt; Exception in thread &quot;main&quot; java.lang.NullPointerException<br>
&gt;       at<br>
&gt; org.drools.reteoo.AccumulateNode.getFirstMatch(AccumulateNode.java:1050)<br>
&gt;       at<br>
&gt; org.drools.reteoo.AccumulateNode.modifyLeftTuple(AccumulateNode.java:345)<br>
&gt;       at<br>
&gt; org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:259)<br>
&gt;       at<br>
&gt; org.drools.reteoo.AccumulateNode.evaluateResultConstraints(AccumulateNode.java:676)<br>
&gt;       at<br>
&gt; org.drools.reteoo.ReteooWorkingMemory$EvaluateResultConstraints.execute(ReteooWorkingMemory.java:590)<br>
&gt;       at<br>
&gt; org.drools.common.PropagationContextImpl.evaluateActionQueue(PropagationContextImpl.java:350)<br>
&gt;       at<br>
&gt; org.drools.rule.SlidingLengthWindow.assertFact(SlidingLengthWindow.java:119)<br>
&gt;       at org.drools.rule.BehaviorManager.assertFact(BehaviorManager.java:94)<br>
&gt;       at org.drools.reteoo.WindowNode.assertObject(WindowNode.java:167)<br>
&gt;       at<br>
&gt; org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:497)<br>
&gt;       at<br>
&gt; org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:382)<br>
&gt;       at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:235)<br>
&gt;       at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:240)<br>
&gt;       at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:350)<br>
&gt;       at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:311)<br>
&gt;       at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:127)<br>
&gt;       at org.drools.common.NamedEntryPoint.insert(NamedEntryPoint.java:55)<br>
&gt;       at drools5fusioneval.Average.main(Average.java:66)<br>
&gt;<br>
&gt; ### Average.java ###<br>
&gt; package drools5fusioneval;<br>
&gt;<br>
&gt; import java.io.IOException;<br>
&gt; import java.util.Random;<br>
&gt; import org.drools.KnowledgeBase;<br>
&gt; import org.drools.KnowledgeBaseConfiguration;<br>
&gt; import org.drools.KnowledgeBaseFactory;<br>
&gt; import org.drools.builder.KnowledgeBuilder;<br>
&gt; import org.drools.builder.KnowledgeBuilderFactory;<br>
&gt; import org.drools.builder.ResourceType;<br>
&gt; import org.drools.conf.EventProcessingOption;<br>
&gt; import org.drools.io.ResourceFactory;<br>
&gt; import org.drools.runtime.StatefulKnowledgeSession;<br>
&gt; import org.drools.runtime.rule.WorkingMemoryEntryPoint;<br>
&gt;<br>
&gt; class AvgDFEChannel implements org.drools.runtime.Channel {<br>
&gt;     @Override<br>
&gt;     public void send(Object o) {<br>
&gt;         System.err.println (&quot;Recieved channel message: &quot;+ o);<br>
&gt;     }<br>
&gt; }<br>
&gt;<br>
&gt; public class Average {<br>
&gt;     public static void main(String[] args) throws InterruptedException,<br>
&gt; IOException {<br>
&gt;         KnowledgeBaseConfiguration kbconfig =<br>
&gt; KnowledgeBaseFactory.newKnowledgeBaseConfiguration();<br>
&gt;         kbconfig.setOption(EventProcessingOption.STREAM);<br>
&gt;<br>
&gt;         KnowledgeBase kbase =<br>
&gt; KnowledgeBaseFactory.newKnowledgeBase(kbconfig);<br>
&gt;<br>
&gt;         KnowledgeBuilder kbuilder =<br>
&gt; KnowledgeBuilderFactory.newKnowledgeBuilder();<br>
&gt;<br>
&gt; kbuilder.add(ResourceFactory.newClassPathResource(&quot;drools5fusioneval/average.drl&quot;),<br>
&gt; ResourceType.DRL);<br>
&gt;         if (kbuilder.hasErrors()) {<br>
&gt;             System.err.println(kbuilder.getErrors().toString());<br>
&gt;         }<br>
&gt;         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());<br>
&gt;<br>
&gt;         final StatefulKnowledgeSession session =<br>
&gt; kbase.newStatefulKnowledgeSession();<br>
&gt;         session.registerChannel(&quot;heartbeat&quot;, new AvgDFEChannel ());<br>
&gt;         WorkingMemoryEntryPoint ep01 =<br>
&gt; session.getWorkingMemoryEntryPoint(&quot;ep01&quot;);<br>
&gt;<br>
&gt;         new Thread() {<br>
&gt;             public void run() {<br>
&gt;                 session.fireUntilHalt();<br>
&gt;             }<br>
&gt;         }.start();<br>
&gt;<br>
&gt;         Thread.sleep (5000); // give the engine time to get setup<br>
&gt;<br>
&gt;         Server hiwaesdk = new Server (&quot;hiwaesdk&quot;);<br>
&gt;         session.insert(hiwaesdk);<br>
&gt;         long LIMIT = 120;<br>
&gt;         Random rnd = new Random (System.nanoTime());<br>
&gt;<br>
&gt;         for (long i = LIMIT; i &gt; 0; i--) {<br>
&gt;             int j = rnd.nextInt (212);<br>
&gt;             ep01.insert (new IntEvent (j));<br>
&gt;             //Thread.sleep (0x1);<br>
&gt;         }<br>
&gt;<br>
&gt;         System.out.println (hiwaesdk);<br>
&gt;     }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; ### average.drl ###<br>
&gt; package drools5fusioneval<br>
&gt;<br>
&gt; declare IntEvent<br>
&gt;     @role ( event )<br>
&gt;     @expires(15s)<br>
&gt; end<br>
&gt;<br>
&gt; declare Statistics<br>
&gt;     opsec : long<br>
&gt;     total : long<br>
&gt; end<br>
&gt; global Statistics stats;<br>
&gt;<br>
&gt; rule &quot;Init engine&quot;<br>
&gt;     salience 100<br>
&gt; when<br>
&gt; then<br>
&gt;     stats = new Statistics ();<br>
&gt;     stats.setTotal (0);<br>
&gt;     stats.setOpsec (0);<br>
&gt;     drools.getWorkingMemory ().setGlobal (&quot;stats&quot;, stats);<br>
&gt;     System.out.println (&quot;Engine initialized&quot;);<br>
&gt; end<br>
&gt;<br>
&gt; rule &quot;number rule&quot;<br>
&gt; when<br>
&gt;     $e : IntEvent () from entry-point ep01<br>
&gt;     $s : Server (hostname == &quot;hiwaesdk&quot;)<br>
&gt; then<br>
&gt;     $s.currentTemp = $e.data;<br>
&gt;     stats.setOpsec (stats.getOpsec () + 1);<br>
&gt;     stats.setTotal (stats.getTotal () + 1);<br>
&gt; end<br>
&gt;<br>
&gt; rule &quot;average temp&quot;<br>
&gt; when<br>
&gt;     Number ($avg : intValue) from accumulate (<br>
&gt;             IntEvent ($temp : data) over window:length(10) from entry-point<br>
&gt; ep01, average ($temp)<br>
&gt;         )<br>
&gt;     $s : Server (hostname == &quot;hiwaesdk&quot;)<br>
&gt; then<br>
&gt;     $s.avgTemp = $avg;<br>
&gt; end<br>
&gt;<br>
&gt; rule &quot;Heartbeat&quot;<br>
&gt;     timer ( int: 5s 5s)<br>
&gt; when<br>
&gt; then<br>
&gt;     channels[&quot;heartbeat&quot;].send (&quot;Heartbeat: &quot;+ stats.getOpsec () / 5 +&quot;, &quot;+<br>
&gt; stats.getTotal ());<br>
&gt;     stats.setOpsec (0);<br>
&gt; end<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; View this message in context:<br>
&gt; <a href="http://drools.46999.n3.nabble.com/NPE-from-reteoo-AccumulateNode-tp4023810.html" target="_blank">http://drools.46999.n3.nabble.com/NPE-from-reteoo-AccumulateNode-tp4023810.html</a><br>
&gt; Sent from the Drools: User forum mailing list archive at Nabble.com.<br>
&gt; _______________________________________________<br>
&gt; rules-users mailing list<br>
&gt; <a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
&gt;<br>
_______________________________________________<br>
rules-users mailing list<br>
<a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div>