if (action.isPending()
&& (action.getStatus() == WorkflowActionBean.Status.PREP
|| action.getStatus() == WorkflowActionBean.Status.START_RETRY || action.getStatus() == WorkflowActionBean.Status.START_MANUAL)) {
if (workflow.getStatus() == WorkflowJob.Status.RUNNING) {
ActionExecutor executor = Services.get().get(ActionService.class).getExecutor(action.getType());
Configuration conf = workflow.getWorkflowInstance().getConf();
int maxRetries = conf.getInt(OozieClient.ACTION_MAX_RETRIES, executor.getMaxRetries());
long retryInterval = conf.getLong(OozieClient.ACTION_RETRY_INTERVAL, executor.getRetryInterval());
executor.setMaxRetries(maxRetries);
executor.setRetryInterval(retryInterval);
if (executor != null) {
ActionExecutorContext context = null;
try {
boolean isRetry = false;
if (action.getStatus() == WorkflowActionBean.Status.START_RETRY
|| action.getStatus() == WorkflowActionBean.Status.START_MANUAL) {
isRetry = true;
}
context = new ActionCommand.ActionExecutorContext(workflow, action, isRetry);
try {
String tmpActionConf = XmlUtils.removeComments(action.getConf());
String actionConf = context.getELEvaluator().evaluate(tmpActionConf, String.class);
action.setConf(actionConf);
XLog.getLog(getClass()).debug("Start, name [{0}] type [{1}] configuration{E}{E}{2}{E}",
action.getName(), action.getType(), actionConf);
}
catch (ELEvaluationException ex) {
throw new ActionExecutorException(ActionExecutorException.ErrorType.TRANSIENT,
EL_EVAL_ERROR, ex.getMessage(), ex);
}
catch (ELException ex) {
context.setErrorInfo(EL_ERROR, ex.getMessage());
XLog.getLog(getClass()).warn("ELException in ActionStartCommand ", ex.getMessage(), ex);
handleError(context, store, workflow, action);
return null;
}
catch (org.jdom.JDOMException je) {
context.setErrorInfo("ParsingError", je.getMessage());
XLog.getLog(getClass()).warn("JDOMException in ActionStartCommand ", je.getMessage(), je);
handleError(context, store, workflow, action);
return null;
}
catch (Exception ex) {
context.setErrorInfo(EL_ERROR, ex.getMessage());
XLog.getLog(getClass()).warn("Exception in ActionStartCommand ", ex.getMessage(), ex);
handleError(context, store, workflow, action);
return null;
}
action.setErrorInfo(null, null);
incrActionCounter(action.getType(), 1);
Instrumentation.Cron cron = new Instrumentation.Cron();
cron.start();
executor.start(context, action);
cron.stop();
FaultInjection.activate("org.apache.oozie.command.SkipCommitFaultInjection");
addActionCron(action.getType(), cron);
action.setRetries(0);
if (action.isExecutionComplete()) {
if (!context.isExecuted()) {
XLog.getLog(getClass()).warn(XLog.OPS,
"Action Completed, ActionExecutor [{0}] must call setExecutionData()",
executor.getType());
action.setErrorInfo(EXEC_DATA_MISSING,
"Execution Complete, but Execution Data Missing from Action");
failJob(context);
store.updateAction(action);
store.updateWorkflow(workflow);
return null;
}
action.setPending();
queueCallable(new ActionEndCommand(action.getId(), action.getType()));
}
else {
if (!context.isStarted()) {
XLog.getLog(getClass()).warn(XLog.OPS,
"Action Started, ActionExecutor [{0}] must call setStartData()",
executor.getType());
action.setErrorInfo(START_DATA_MISSING,
"Execution Started, but Start Data Missing from Action");
failJob(context);
store.updateAction(action);
store.updateWorkflow(workflow);