If you're writing something that uses the Activiti API to automatically handle something, but there could be multiple copies of it, is there a good way to have it work with the workflow and handle the inevitable collisions?I was thinking about having the workflow split into a "queued" user/manual task and a "processing" user/manual task:[ Queued ] —> [ Processing ] —>And the automated process would do something like this:
boolean success = false;
while (!success)
{
List<Task> queuedTasks = getProcessEngine().getTaskService().createTaskQuery().orderByDueDateNullsFirst().asc().taskId("queued").list();
if (queuedTasks.size() > 0)
{
Task claimableTask = queuedTasks.get(0);
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("claimed", myProcessId); // There would be no other way to tell which task we claimed, would there?
try
{
getProcessEngine().getTaskService().complete(claimableTask.getId(), variables);
success = true;
}
catch (ActivitiObjectNotFoundException e)
{
// Something else claimed it? We'll try again.
}
}
else
break;
}
I prefer a "pull" model like this (hence the UserTask instead of a ServiceTask) in case it needs to get spun up on multiple VMs.Will this cause problems? Are there better ways of accomplishing this?Regards,– Ritchie Annand