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