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