Wolfgang,<div>I'd agree with you although I will continue to research further. If it is as you suggest - a race condition - I would think a more appropriate reaction of the system would be to emit a warning that events are expiring before they can be considered by the rules engine, although I would think that this is a use case which does not see much real life execution. Thank you very much for your time and input into this matter, it's been educational.</div>
<div><br></div><div>Sincerely,<span></span></div><div>Jason<br><br>On Saturday, May 4, 2013, Wolfgang Laun wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I can confirm that (using 5.5.0) this NPE occurs predictably with a<br>
limit of 500000.<br>
<br>
It looks like a race condition to me - at least that is what line<br>
DefaultAgenda.java:1319 suggests. Possibly it is due to automatic<br>
retraction "overtaking" rule firing, since the latter tends to take<br>
much, much longer than the ~10sec the mere insertion of 500K events<br>
takes on my system.<br>
<br>
500,000 inserted in 10s means 50,000/s, and that, in turn, implies<br>
50,000 retractions per second. 30s after the last insertion, only<br>
~90,000 firings have taken place. (I added a printout of the counter's<br>
total after the Thread.sleep().)<br>
<br>
It's interesting to experiment with the @expires value: Everything<br>
else remaining the same, a setting of @expires(10s) will let the<br>
firings complete without a NPE.<br>
<br>
So, I'm back to my surmise: a race condition, due to expiry being cut<br>
too short to cope with the system load. I'd still classify this as a<br>
Drools bug: it should notice that it is being overtaxed and/or<br>
destabilizing itself.<br>
<br>
-W<br>
<br>
<br>
On 04/05/2013, Jason Barto <<a>jason.p.barto@gmail.com</a>> wrote:<br>
> Wolfgang,<br>
> thank you for your prompt reply. After further work with my code I think<br>
> the culprit may have either been the setting of the event expiration time<br>
> to 1s OR that I was using session.update to insert a new counter object;<br>
> but maybe not. I cleaned up my code in order to send it out. In doing so<br>
> I also downloaded the official Drools 5.5 distribution (in the previous<br>
> example I was using the libraries packaged with BRMS). Between the code<br>
> cleanup and the use of the official distro I'm no longer experiencing a<br>
> Consequence Exception.<br>
><br>
> That being said I am still experiencing a NPE when a high iteration count.<br>
> If you take a look at Drools5FusionEval.java, around line 51 you'll see a<br>
> variable 'eventLimit'. If set to 500000 it seems to pretty reliably kick<br>
> out the following NPE:<br>
><br>
> Exception in thread "Thread-1" java.lang.NullPointerException<br>
> at<br>
> org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1319)<br>
> at<br>
> org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221)<br>
> at<br>
> org.drools.common.DefaultAgenda.fireUntilHalt(DefaultAgenda.java:1434)<br>
> at<br>
> org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:755)<br>
> at<br>
> org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:731)<br>
> at<br>
> org.drools.impl.StatefulKnowledgeSessionImpl.fireUntilHalt(StatefulKnowledgeSessionImpl.java:247)<br>
> at drools5fusioneval.Drools5FusionEval$1.run(Drools5FusionEval.java:47)<br>
><br>
> As I've said I'm still very new to Drools and trying to understand better<br>
> how it does what it does - any information that anyone can provide to help<br>
> me understand why the above error is being experienced would be greatly<br>
> appreciated.<br>
><br>
> Source code and rules are attached.<br>
><br>
> Sincerely,<br>
> Jason<br>
><br>
><br>
> On Sat, May 4, 2013 at 7:58 AM, Wolfgang Laun<br>
> <<a>wolfgang.laun@gmail.com</a>>wrote:<br>
><br>
>> Works for me (5.5.0, 5.4.0) - at least based on the code you've posted<br>
>> which (apart from the omitted getters and setters) isn't the one you've<br>
>> been running, and so you may have changed or omitted something<br>
>> that's essential.<br>
>><br>
>> The full stack dump might shed some more light on this, and the full and<br>
>> true code of the rule RHS whre the NPE is caused.<br>
>><br>
>> -W<br>
>><br>
>> On 04/05/2013, Jason Barto <<a>jason.p.barto@gmail.com</a>> wrote:<br>
>> > I am new to Drools (Expert and Fusion) and have been reading through<br>
>> > the<br>
>> > materials over the last few days. After going through some of the<br>
>> tutorial<br>
>> > code I wrote a very quick and dirty to perform a base assessment of the<br>
>> > speed of Fusion / Expert. My code is below. The strange thing I'm<br>
>> > currently receiving is, if I insert 100k events the test completes<br>
>> > successfully, if I insert 150k events, I receive a ConsequenceException<br>
>> > caused by an NPE. Being new to Drools I must be doing something wrong,<br>
>> can<br>
>> > anyone please provide some guidance?<br>
>> ><br>
>> > (Main function)<br>
>> > Counter cc = new Counter ();<br>
>> > session.insert (cc);<br>
>> > for (int i = 0; i < 150000; i++) {<br>
>> > entryPoint01.insert (new MyEvent ());<br>
>> > }<br>
>> ><br>
>> > (Counter Class)<br>
>> > public class Counter {<br>
>> > private long total = 0;<br>
>> > // get / set total<br>
>> > public void addValue (int val) {<br>
>> > total += val;<br>
>> > }<br>
>> > }<br>
>> ><br>
>> > (MyEvent Class)<br>
>> > public class MyEvent {<br>
>> > private int value = 1;<br>
>> > // get / set value<br>
>> > }<br>
</blockquote></div>