Problem using Event Handlers
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-21-2014 04:33 AM
Event Handlers are introduced In Activiti 5.15
I want to execute custom logic when the TASK_ASSIGNED event is called
Whenever Task is Assigned to a user i want that Event listener should listen the TASK_ASSIGNED event and i want assignee(User) of task in the event TASK_ASSIGNED
I have created my Event Listener for that as below
And I have generated Unit Test for Process
OUTPUT of JUnit Test:
So when I Run The unit Test I got Result From TASK_COMPLETED and from Junit Test. But, in TASK_ASSIGNED: case I got list of Task = 0
This may be because First Activiti call TASK_ASSIGNED event and then it update Activiti DB so when we query inside TASK_ASSIGNED we will get no of Task =0
But I want assignee in TASK_ASSIGNED event. so, when Task is assigned to user, I want to get that assignee and want to use some Custom logic on that Assignee
Please Help me For this problem
I want to execute custom logic when the TASK_ASSIGNED event is called
Whenever Task is Assigned to a user i want that Event listener should listen the TASK_ASSIGNED event and i want assignee(User) of task in the event TASK_ASSIGNED
I have created my Event Listener for that as below
public class MyEventListener implements ActivitiEventListener{ @Override public boolean isFailOnException() { // TODO Auto-generated method stub return false; } @Override public void onEvent(ActivitiEvent event) { // TODO Auto-generated method stub switch(event.getType()){ case TASK_ASSIGNED: System.out.println("From Event handler TASK_ASSIGNED:"); TaskService ts = event.getEngineServices().getTaskService(); System.out.println("No of Task: " + ts.createTaskQuery().processInstanceId(event.getProcessInstanceId()).count()); List<Task> tasks = ts.createTaskQuery().processInstanceId(event.getProcessInstanceId()).list(); for(Task task : tasks) { System.out.println("Task Name: " + task.getName()); System.out.println("Task Assignee: " + task.getAssignee()); System.out.println("Task Description: " + task.getDescription()); } break; case TASK_COMPLETED: System.out.println("From Event handler TASK_COMPLETED:"); TaskService ts2 = event.getEngineServices().getTaskService(); System.out.println("No of Task: " + ts2.createTaskQuery().processInstanceId(event.getProcessInstanceId()).count()); tasks = ts2.createTaskQuery().processInstanceId(event.getProcessInstanceId()).list(); for(Task task : tasks) { System.out.println("Task Name: " + task.getName()); System.out.println("Task Assignee: " + task.getAssignee()); System.out.println("Task Description: " + task.getDescription()); } break; } }}
And I have generated Unit Test for Process
TaskService ts = activitiRule.getTaskService(); System.out.println("From Junit Test"); System.out.println("No of Tasks from UnitTest: " +ts.createTaskQuery().processInstanceId(processInstance.getId()).count() ); List<Task> tasks = ts.createTaskQuery().processInstanceId(processInstance.getId()).list(); for(Task task : tasks) { System.out.println("Task Name: " + task.getName()); System.out.println("Task Assignee: " + task.getAssignee()); System.out.println("Task Description: " + task.getDescription()); ts.complete(task.getId()); }
OUTPUT of JUnit Test:
From Event handler TASK_ASSIGNED:No of Task: 0From Junit TestNo of Tasks from UnitTest: 1Task Name: ApprovalTask Assignee: kermitTask Description: This is Simple Approval TaskFrom Event handler TASK_COMPLETED:No of Task: 1Task Name: ApprovalTask Assignee: kermitTask Description: This is Simple Approval Task
So when I Run The unit Test I got Result From TASK_COMPLETED and from Junit Test. But, in TASK_ASSIGNED: case I got list of Task = 0
This may be because First Activiti call TASK_ASSIGNED event and then it update Activiti DB so when we query inside TASK_ASSIGNED we will get no of Task =0
But I want assignee in TASK_ASSIGNED event. so, when Task is assigned to user, I want to get that assignee and want to use some Custom logic on that Assignee
Please Help me For this problem
Labels:
- Labels:
-
Archive
1 REPLY 1
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-22-2014 04:37 AM
You cannot rely on the DB to be consistent at the time the event-handlers are fired. Not only is the transaction not comitted, but some entities may have not been updated/flushed to the DB. Any entities that are related to the fired event can be accessed inside the event payload. This represents the current state, which *can* be different from the DB.
In your case, using the ActivitiEvent, casting to ActivitiEntityEvent and extracting the Task should get you to the assignee. There is a lot of documentation around the different types of events, maybe a good point to start…
In your case, using the ActivitiEvent, casting to ActivitiEntityEvent and extracting the Task should get you to the assignee. There is a lot of documentation around the different types of events, maybe a good point to start…
