<p>Davide and Wolfgang, thank you both for your time and feedback into my questions as well as to other&#39;s questions. I&#39;m rather interested in learning more about the internals of drools in the hopes of making contribution when and where possible. I&#39;d imagine there&#39;s a developer guide that talks to fusion&#39;s architecture that would act as a companion to reviewing the source code? </p>

<p>Sincerely, <br>
Jason </p>
<div class="gmail_quote">On May 14, 2013 8:25 PM, &quot;Davide Sottara&quot; &lt;<a href="mailto:dsotty@gmail.com">dsotty@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">

  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Confirmed as a race condition,
      hopefully it will be fixed in 5.6<br>
      Thanks Jason and Wolfgang<br>
      Davide<br>
      <br>
      On 05/14/2013 06:43 AM, Jason Barto wrote:<br>
    </div>
    <blockquote type="cite">
      <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" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">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>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
rules-users mailing list
<a href="mailto:rules-users@lists.jboss.org" target="_blank">rules-users@lists.jboss.org</a>
<a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a></pre>
    </blockquote>
    <br>
  </div>

<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>