Uploaded image for project: 'JBRULES'
  1. JBRULES
  2. JBRULES-2729

NullPointerException from CompositeMaxDurationTimer.createTrigger

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Critical Critical
    • 5.2.0.CR1
    • 5.1.1.FINAL
    • drools-compiler
    • None
    • Hide

      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.

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

      The timer field of CompositeMaxDurationTimer appears to be not getting populated correctly when certain types of rules are created in Drools Fusion. This results in subsequent calls to CompositeMaxDurationTimer.createTimer to reference a null pointer during execution. While the error triggers during fact insertion in Drools Fusion, it appears to be due to an incomplete timer definition during rules compilation.

            etirelli@redhat.com Edson Tirelli
            will_lauer Will Lauer (Inactive)
            Archiver:
            rhn-support-ceverson Clark Everson

              Created:
              Updated:
              Resolved:
              Archived: