use of org.opencastproject.workflow.api.RetryStrategy in project opencast by opencast.
the class WorkflowServiceImpl method handleOperationResult.
/**
* Callback for workflow operation handlers that executed and finished without exception. This implementation assumes
* that the operation worker has already adjusted the current operation's state appropriately.
*
* @param workflow
* the workflow instance
* @param result
* the workflow operation result
* @return the workflow instance
* @throws WorkflowDatabaseException
* if updating the workflow fails
*/
protected WorkflowInstance handleOperationResult(WorkflowInstance workflow, WorkflowOperationResult result) throws WorkflowDatabaseException {
// Get the operation and its handler
WorkflowOperationInstanceImpl currentOperation = (WorkflowOperationInstanceImpl) workflow.getCurrentOperation();
WorkflowOperationHandler handler = getWorkflowOperationHandler(currentOperation.getTemplate());
// Create an operation result for the lazy or else update the workflow's media package
if (result == null) {
logger.warn("Handling a null operation result for workflow %s in operation %s", workflow.getId(), currentOperation.getTemplate());
result = new WorkflowOperationResultImpl(workflow.getMediaPackage(), null, Action.CONTINUE, 0);
} else {
MediaPackage mp = result.getMediaPackage();
if (mp != null) {
workflow.setMediaPackage(mp);
}
}
// The action to take
Action action = result.getAction();
// Update the workflow configuration. Update the reference to the current operation as well, since the workflow has
// been serialized and deserialized in the meantime.
int currentOperationPosition = currentOperation.getPosition();
workflow = updateConfiguration(workflow, result.getProperties());
currentOperation = (WorkflowOperationInstanceImpl) workflow.getOperations().get(currentOperationPosition);
// Adjust workflow statistics
currentOperation.setTimeInQueue(result.getTimeInQueue());
// Adjust the operation state
switch(action) {
case CONTINUE:
currentOperation.setState(OperationState.SUCCEEDED);
break;
case PAUSE:
if (!(handler instanceof ResumableWorkflowOperationHandler)) {
throw new IllegalStateException("Operation " + currentOperation.getTemplate() + " is not resumable");
}
// Set abortable and continuable to default values
currentOperation.setContinuable(result.allowsContinue());
currentOperation.setAbortable(result.allowsAbort());
ResumableWorkflowOperationHandler resumableHandler = (ResumableWorkflowOperationHandler) handler;
try {
String url = resumableHandler.getHoldStateUserInterfaceURL(workflow);
if (url != null) {
String holdActionTitle = resumableHandler.getHoldActionTitle();
currentOperation.setHoldActionTitle(holdActionTitle);
currentOperation.setHoldStateUserInterfaceUrl(url);
}
} catch (WorkflowOperationException e) {
logger.warn(e, "unable to replace workflow ID in the hold state URL");
}
workflow.setState(PAUSED);
currentOperation.setState(OperationState.PAUSED);
break;
case SKIP:
currentOperation.setState(OperationState.SKIPPED);
break;
default:
throw new IllegalStateException("Unknown action '" + action + "' returned");
}
if (ERROR_RESOLUTION_HANDLER_ID.equals(currentOperation.getTemplate()) && result.getAction() == Action.CONTINUE) {
Map<String, String> resultProperties = result.getProperties();
if (resultProperties == null || StringUtils.isBlank(resultProperties.get(RETRY_STRATEGY)))
throw new WorkflowDatabaseException("Retry strategy not present in properties!");
RetryStrategy retryStrategy = RetryStrategy.valueOf(resultProperties.get(RETRY_STRATEGY));
switch(retryStrategy) {
case NONE:
handleFailedOperation(workflow, workflow.getCurrentOperation());
break;
case RETRY:
currentOperation = (WorkflowOperationInstanceImpl) workflow.getCurrentOperation();
break;
default:
throw new WorkflowDatabaseException("Retry strategy not implemented yet!");
}
}
return workflow;
}
Aggregations