Hi,
I have a Task belonging to a process, when this task is claimed I trigger multiple self assigning Tasks by code.
For example, if user1 claims the task then a couple of pre-defined subtasks are assigned to the same user, in this case user1. Now this user1 can complete these sub tasks or decide to assign it to someone else who eventually completes it.
I need to track the user completing these subtasks within a process variable in the Parent Task. Or suggest a better way of achieving this....
Please guide me... Thank you...
Regards.
Solved! Go to Solution.
Let me restate the question.
1. Process A - Task A assigned to User 1
2. Task B created (programmatically - although the mechanism is not relevant) as a sub task of Task A
3. Task B is reassigned to User 2
4. User 2 completes Task B
You want the ID of User 2 to be saved in a process variable in Process A for use later.
If I have your scenario correct:
Add a task listener to the "complete" event of the dynamically created task using something like:ActivitiListener listener
new ActivitiListener();
listener.setEvent(eventName);
listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS);
listener.setInstance(myTaskListenerImpl);
MyUserTask.getTaskListeners().add(listener);
The Listener class (myTaskListenerImpl) will have a DelegateTask input, this will have a parentTask defined from which you can retrieve the parent task, then the associated process instance. Once you have this, you can create an instance variable.
Hope this is enough to move you forward.
Greg
Paiyyavj13_,
I don't know what version of Activiti you're using, but hopefully it's one of the relatively new versions - you should be able to make use of the Event Dispatcher mechanism that's now standard in Activiti.
As you define the event handlers, you can choose whether it should act globally or on an individual process instance and can be mapped to a plethora of standard events (like 'TASK_COMPLETED') - which would allow you to track those completed tasks.
I'm not sure if this is exactly what you were hoping for, but it is a solution
Hope this helps,
-JEarles
Let me restate the question.
1. Process A - Task A assigned to User 1
2. Task B created (programmatically - although the mechanism is not relevant) as a sub task of Task A
3. Task B is reassigned to User 2
4. User 2 completes Task B
You want the ID of User 2 to be saved in a process variable in Process A for use later.
If I have your scenario correct:
Add a task listener to the "complete" event of the dynamically created task using something like:ActivitiListener listener
new ActivitiListener();
listener.setEvent(eventName);
listener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CLASS);
listener.setInstance(myTaskListenerImpl);
MyUserTask.getTaskListeners().add(listener);
The Listener class (myTaskListenerImpl) will have a DelegateTask input, this will have a parentTask defined from which you can retrieve the parent task, then the associated process instance. Once you have this, you can create an instance variable.
Hope this is enough to move you forward.
Greg
Thank you Greg.... this is exactly what I wanted.... Thank you Jonathan Earles too... the link you sent put me in the right track...
Will try the steps and post back...
Regards.
HiGreg Harley,
I tried the steps mentioned by you but there is a small difference in the way I create my subtasks: they are of Type: "org.activiti.engine.task.Task" and not "org.activiti.bpmn.model.UserTask".
Hence, I could not add my listener to my subtask(as there is no api to get TaskListeners and set it in org.activiti.engine.task.Task).
I thought of changing my subtasks into "org.activiti.bpmn.model.UserTask" Type, but I could not find api to set tenantId and parentTaskId on it.
Could you suggest some pointers.... Appreciate your help!
Thank you....
Regards.
Hi,
You're right. My solution is how you would do igt in a parseHandler (which is where I pulled my code from).
From what I can tell (looking at the API), we can't add listeners dynamically, they have to be added to the process model either when the process is modeled, or inside a parse handler.
So....you should still be able to add a TaskListener that is triggered on the "assignment" event.
This listener can still create your sub tasks using code like:
// save task Task newTask = taskService.newTask(); newTask.setParentTaskId(parentTask.getId()); newTask.setName("MySubTask"); taskService.saveTask(newTask);
Now, you should also be able to add an event listener to the process that is bound to the TASK_COMPLETE event.
The listener would get the execution id from the event and from this you should be able to create a historicTaskInstance query based on the executionId.
Once you have the task, look to see if there is a parent task, if so, set the process variable.
Something of a long way around, but it should get you there.
Be aware, events are processed asynchronously which is why you need to use a history query rather than a runtime query because you cant guarantee order.
Thank you Greg...
Ask for and offer help to other Alfresco Process Services and Activiti Users and members of the Alfresco team.
By using this site, you are agreeing to allow us to collect and use cookies as outlined in Alfresco’s Cookie Statement and Terms of Use (and you have a legitimate interest in Alfresco and our products, authorizing us to contact you in such methods). If you are not ok with these terms, please do not use this website.