In one of my discussions with a customer, there was a query regarding the Human workflow and the flow of control between different activities. They wanted to know how the BPEL service and Workflow service interacts with each other. If you see the InitiateTask operation it is a synchronous operation which calls the workflow service and passes the payload and task attributes and gets the control back to BPEL process.
In case of a basic flow the initiate task is executed, workflow service instance is created and service waits in queue of user to be approved/rejected or complete an outcome. Where as in BPEL the control returns after initiateTask invocation, but the next activity is a receive callback from Workflow service which will only trigger once the user completes his action. So the BPEL process instance gets dehydrated and waits for action.
In case of designing an advanced flow with multiple callbacks, the BPEL generates extra code to handle multiple operation updates that happen from the workflow service. The workflow service will run as an independent process flow which has java API calls to invoke the callback operations defined in the TaskService wsdl to give back control to BPEL after different task stages. In BPEL, the flow goes into a while loop waiting for a callback from the workflow service. The Pick activity as shown below will be looking for onMessage from ->OnTaskCompleted,OnTaskAssigned,OnTaskUpdated and OnSubTaskUpdated.
- onTaskCompleted — This callback is invoked when the task is completed, expired, withdrawn, or errored.
- onTaskAssigned — This callback is invoked when the task is assigned to a new set of assignees due to the following actions:
- Outcome update
- Skip current assignment
- Override routing slip
- onTaskUpdated — This callback is invoked for any other update to the task that does not fall in the onTaskComplete or onTaskAssigned callback. This includes updates on tasks due to request for information, submit information, escalation, reassign, and so on.
- onSubTaskUpdated — This callback is invoked for any update to a subtask.
To go to advanced mode, select the Allow task and routing customizations in BPEL callbacks check box. This will enable the workflow service to notify the BPEL process using OnMessage callbacks every time a task is routed to a different user or when the task status changes
Coming to my customer requirements, they wanted to be notified incase the task is reassigned for more than 3 times .In case of a reassign the OnTaskUpdated callback will be invoked and control will get into the OnTaskUpdated parallel flow where you can add the required customizations.. So this logic was embedded in this callback flow. After the flow is completed it again goes back and waits in the while loop till next callback event is activated from the workflow service.
The figure defines the human workflow process flow inside the BPEL. The while loop enables the BPEL process instance to wait on pick activity till the task status gets updated to task completion/expiration/error/stale/withdrawn. This brings in multiple options for customization within the BPEL based on the workflow status/updates. This is really good feature using multiple callbacks functionality.