End tasks in a Fork
matrixpooh Nov 19, 2009 8:57 AMMy process is a fork with two task nodes and a join.
I trigger the process to start both tasks and then end each of them.
During the execution of end() on task 1, the task is being submitted and then immediately re-instantiated. So when the token is at the join, I still have a freshly created task 1 pending in the actor's queue.
Also, it seems like though 'task-end' is called on the child token, the root token proceeds with 'node-enter' on the same task.
Here's the process definition:
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="" name="parallel.two.sequential.one"> <swimlane name="..."> .... </swimlane> <start-state name="start"> <transition to="fork1"></transition> </start-state> <fork name="fork1"> <transition to="task-node1" name="to-task-1"></transition> <transition to="task-node2" name="to-task-2"></transition> </fork> <join name="join1"> <transition to="task-node3"></transition> </join> <task-node name="task-node1" > <task swimlane="..." name="Task 1" notify="true"> <controller class="..."/> </task> <transition to="join1" name="to-the-end"></transition> </task-node> <task-node name="task-node2"> <task swimlane="..." name="Task 2" notify="true"> <controller class="..."/> </task> <transition to="join1" name="to-the-end"></transition> </task-node> <end-state name="end"></end-state> </process-definition>
Here's the snippet of the execution:
ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); assertEquals("start", token.getNode().getName()); token.signal(); Map<String, Token> childTokens = token.getActiveChildren(); assertTrue(childTokens.size() > 0); final Iterator<Token> iterator = childTokens.values().iterator(); Token oneBranchToken = iterator.next(); TaskMgmtInstance taskManagementInstance = oneBranchToken .getProcessInstance().getTaskMgmtInstance(); Collection<TaskInstance> taskInstances = taskManagementInstance.getUnfinishedTasks(oneBranchToken ); TaskInstance taskInstance = taskInstances.iterator().next(); taskInstance.end(); jbpmContext.save(processInstance);
Here's the debug log snippet that shows task 1 being submitted and then immediately initialized again:
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'after-signal' on StartState(start) for Token(/)
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'task-end' on Task(Task 1) for Token(/to-task-1)
08:48:11,091 DEBUG|main|: [Controller:submitTaskVariables:23] -------------current node::Task 1
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'before-signal' on Fork(fork1) for Token(/)
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'node-leave' on Fork(fork1) for Token(/)
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'transition' on Transition(to-task-1) for Token(/)
08:48:11,091 DEBUG|main|: [GraphElement:fireEvent:179] event 'node-enter' on TaskNode(task-node1) for Token(/)
08:48:11,107 DEBUG|main|: [Controller:initializeTaskVariables:17] -------------current node::Task 1
08:48:11,107 DEBUG|main|: [GraphElement:fireEvent:179] event 'task-create' on Task(Task 1) for Token(/)
08:48:11,107 DEBUG|main|: [TaskInstance:setActorId:258] assigning task 'Task 1' to 'analyst'
08:48:11,107 DEBUG|main|: [GraphElement:fireEvent:179] event 'task-assign' on Task(Task 1) for Token(/)
08:48:11,107 DEBUG|main|: [GraphElement:executeAction:271] executing Action(Task 1)
08:48:11,107 DEBUG|main|: [Token:lock:748] token[2489] is locked by token[2489]
08:48:11,107 DEBUG|main|: [Mail:send:189] skipping mail because there are no recipients
08:48:11,122 DEBUG|main|: [Token:unlock:765] token[2489] is unlocked by token[2489]