In this post, we will see how to withdraw a task using BPM Java API. I will use a human task having parallel participant for the demo purpose as shown below.
Following is piece of code to be used for withdrawing a human task.
public void withdrawTask(String taskId) { try { getWfServiceClient().getTaskService().withdrawTask(getAdminWorkflowContext(), taskId); } catch (Exception ex) { System.out.println("in withdrawTask exception"); ex.printStackTrace(); } }
Note: we should destroy the workflow context when there is no need of the same which is not shown here.
Task Service has another variation of withdraw method where we can pass the task object as shown below.
public void withdrawTask(String taskId) { Task taskDetail = null; IWorkflowContext wfCtx = null; try { wfCtx = getAdminWorkflowContext(); taskDetail = getWfServiceClient().getTaskQueryService().getTaskDetailsById(wfCtx, taskId); getWfServiceClient().getTaskService().withdrawTask(wfCtx, taskDetail); } catch (Exception ex) { System.out.println("in withdrawTask exception"); ex.printStackTrace(); } }
To test this code, create a task and query the WFTASK table using roottaskid as shown below. Observe that 2 child tasks are created for the roottaskid as we are using parallel participant with 2 approvers.
Now execute the above method by passing roottaskid. Query the WFTASK table again to verify all tasks are marked as WITHDRAWN as shown below.
Observations:
- Using roottaskid for withdrawal will result into withdraw of all child tasks.
- The above statement is true even if some of the child tasks are in approved/rejected state. In this case, using roottaskid will withdraw only the eligible child tasks.
- The above statement is also true even if some of the child tasks are in ALERTED state. Typically tasks get into this state because BPM runtime unable to resolve the assignee. In the following screenshot, the user siva1 is not existing in my server hence the created task is in ALERTED state.
- By default, Admin, Creator and Owner of the task can do withdraw of a task. we can see this information in Access tab of human task editor in jdeveloper. Observe the usage of Admin WorkflowContext in the above code.
We will get an error like below when unauthorized user try to withdraw the task. To reproduce the error, we can create the task using weblogic user and try to withdraw that user using another user who is not admin, creator and assignee.
<Nov 13, 2017, 6:19:03,842 PM IST> <Error> <oracle.soa.services.workflow.query> <BEA-000000> <<.> exception.code:30513
exception.type: ERROR
exception.severity: 2
exception.name: Insufficient privileges to access the task information for this task. The task must have either expired or assigned to another user.
exception.description: User siva cannot access the task information for task: fd1df834-04b3-4a5f-a7b5-8bbf83f8dc72.
exception.fix: Ensure that the user has been granted appropriate privileges to access the task information for this task or check on expiration and esclation policies.
- We can get owner, creator and assignee details for a task using following sql query against soainfra schema.
select roottaskid, taskid, state,assignees,tasknumber,OWNERUSER,CREATOR from wftask where roottaskid = ‘fd1df834-04b3-4a5f-a7b5-8bbf83f8dc72’
Hi Shiva, Thanks for the information. My ask was without using any java code, will we be able to withdraw the user task using the Oracle BPM notations/activities ?