6.10.4. Long Actions

Long actions are very similar to actions, but they are executed in three separate phases. Only the first and the last phase are permitted to access the containing process and its variables. The second phase runs completely outside of any database transaction. Therefore, the second phase does not consume system resources and there is no need to finish it quickly. Long actions are particularly well suited for accessing remote servers that may not respond immediately.

The first phase consists of the method

Object extractParameters(Task task);

which must read all task and process variables that are needed for processing. Afterwards, all relevant data must be packaged into an object of arbitrary type, which is returned from the method. If multiple values have to be returned, either an object array or a custom class can be used for aggregating these values. Because a long action always runs in the context of an automated task, the method is passed a correctly typed task object immediately. Often you will have to retrieve the containing process before reading any variables. Afterwards the method

Object execute(Object params);

is executed. It is passed the object that was returned from extractParameters. It may perform arbitrary computations for an extended period before it returns its result as an object. The method may not, however, access any objects of the workflow repository. Finally

ActionResult storeResult(Task task, Object result);

is called with the result from execute. It may write task and process variables as needed. The returned action result is processed as by an ordinary action.

The class LongActionBase implements the LongAction interface and provides some convenience code. Instead of execute and storeResult you simply implement the method

Object doExecute(Object params) throws Exception;

If that method throws an exception, that exception forms the basis of a failed action result. If a value is returned, that value is wrapped in a successful action result. Note that you must implement the extractParameters method even if you base you action on the LongActionBase class.

The method abort() should be implemented to let all running extractParameters, execute and storeResult method calls return early, possibly by throwing an ActionAbortedException. This method is called when the Workflow Server is shutting down.

Like an ordinary action, a long action must be reentrant and it must be robust against being rerun in the case of a problem.