I'm using the following single rule (no others are defined in the rulebase):
declare Event
@role(event)
@expires(30s)
end
rule "InterfaceUp"
when
$down : Event ( type == "linkdown" )
$up : Event ( type == "linkup", this after $down)
not Event (type =="linkup", this before $up, this after $down)
then
channels["up"].send($up);
end
The event class is defined as
public class Event {
public String name;
public String type;
public String extra;
public Event (String name, String type, String extra)
{ this.name = name; this.type = type; this.extra = extra;}
}
Events are being inserted into the stateful session as:
session.insert(new Event("trap","linkdown","interface 2"));
session.insert(new Event("trap","linkup","interface 1"));
session.insert(new Event("trap","linkup","interface 1"));
session.insert(new Event("trap","reboot","device1"));
The null pointer exception triggers when the second event is inserted into the working memory, with the following stack trace:
Exception in thread "main" java.lang.NullPointerException
at org.drools.time.impl.CompositeMaxDurationTimer.createTrigger(CompositeMaxDurationTimer.java:59)
at org.drools.common.Scheduler.scheduleAgendaItem(Scheduler.java:55)
at org.drools.common.DefaultAgenda.scheduleItem(DefaultAgenda.java:314)
at org.drools.reteoo.RuleTerminalNode.assertLeftTuple(RuleTerminalNode.java:185)
at org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:189)
at org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:78)
at org.drools.reteoo.NotNode.assertLeftTuple(NotNode.java:101)
at org.drools.reteoo.SingleLeftTupleSinkAdapter.doPropagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:189)
at org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateAssertLeftTuple(SingleLeftTupleSinkAdapter.java:64)
at org.drools.reteoo.JoinNode.assertObject(JoinNode.java:128)
at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:450)
at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:378)
at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:145)
at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:450)
at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:368)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:190)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:145)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1174)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1123)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:917)
at org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:251)
at net.wlauer.DroolsEngine.NonSpringRulesEngine.main(NonSpringRulesEngine.java:74)
Removing the "not Event" clause from the rule appears to avoid the problem, probably because CompositeMaxDurationTimer isn't necessary to track durations of multiple other events.