Uploaded image for project: 'jBPM'
  1. jBPM
  2. JBPM-3197

Signal start event doesn't work when process is dynamically added to knowledge base

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • jBPM 5.1
    • jBPM 5.0
    • Runtime Engine
    • None

      It seems that the signal start event doesn't work when a process definition is added to a knowledge base of an already created session.
      I have slightly modified the testSignalStart() unit test of SimpleBPMNProcessTest.java to reproduce the problem
      Firstly, I've added a new process definition named BPMN2-SignalStart2.bpmn2, based on the original BPMN2-SignalStart.bpmn2, just renaming the signal name from MySignalStart to MySignalStart2 and renaming the process id from Minimal to Minimal2

      The following test runs without any problem, since both process definitions are added before the session is created

      public void testSignalStart() throws Exception {
      KnowledgeBase kbase = createKnowledgeBase("BPMN2-SignalStart.bpmn2");
      KnowledgeBase kbase2 = createKnowledgeBase("BPMN2-SignalStart2.bpmn2");
      kbase.addKnowledgePackages(kbase2.getKnowledgePackages());
      StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
      final List<Long> list = new ArrayList<Long>();
      ksession.addEventListener(new DefaultProcessEventListener() {
      public void afterProcessStarted(ProcessStartedEvent event)

      { list.add(event.getProcessInstance().getId()); } }); ksession.signalEvent("MyStartSignal", "NewValue"); ksession.signalEvent("MyStartSignal2", "NewValue"); assertEquals(2, list.size()); }

      However, the following test fail to run, as the process Minimal2 is never started when doing ksession.signalEvent("MyStartSignal2", "NewValue");
      If I start the process directly using ksession.startProcess("Minimal2") then the test passes.

      public void testSignalStart2() throws Exception {
      KnowledgeBase kbase = createKnowledgeBase("BPMN2-SignalStart.bpmn2");
      KnowledgeBase kbase2 = createKnowledgeBase("BPMN2-SignalStart2.bpmn2");

      StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
      ksession.getKnowledgeBase().addKnowledgePackages(kbase2.getKnowledgePackages());
      final List<Long> list = new ArrayList<Long>();
      ksession.addEventListener(new DefaultProcessEventListener() {
      public void afterProcessStarted(ProcessStartedEvent event)

      { list.add(event.getProcessInstance().getId()); } }); ksession.signalEvent("MyStartSignal", "NewValue"); ksession.signalEvent("MyStartSignal2", "NewValue"); //ksession.startProcess("Minimal2"); assertEquals(2, list.size()); }

      I found some clues on why this is happening.
      The first test works because, when the session is created, the method ProcessRuntimeImpl::initProcessEventListeners() is invoked, and the event listeners are properly initialized
      But in the second test, the event listeners are not initialized since adding a package does not reinitialize the session.

              kverlaen@redhat.com Kris Verlaenen
              kverlaen@redhat.com Kris Verlaenen
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved: