in jbatch/src/main/java/org/apache/batchee/container/impl/controller/BaseStepController.java [129:218]
public ExecutionStatus execute() {
// Here we're just setting up to decide if we're going to run the step or not (if it's already complete and
// allow-start-if-complete=false.
try {
boolean executeStep = shouldStepBeExecuted();
if (!executeStep) {
return new ExecutionStatus(ExtendedBatchStatus.DO_NOT_RUN, stepStatus.getExitStatus());
}
} catch (final Throwable t) {
// Treat an error at this point as unrecoverable, so fail job too.
markJobAndStepFailed();
LOGGER.log(Level.SEVERE, t.getMessage(), t);
rethrowWithMsg("Caught throwable while determining if step should be executed. Failing job.", t);
}
// At this point we have a StepExecution. Setup so that we're ready to invoke artifacts.
try {
startStep();
} catch (final Throwable t) {
// Treat an error at this point as unrecoverable, so fail job too.
markJobAndStepFailed();
LOGGER.log(Level.SEVERE, t.getMessage(), t);
rethrowWithMsg("Caught throwable while starting step. Failing job.", t);
}
// At this point artifacts are in the picture so we want to try to invoke afterStep() on a failure.
try {
invokePreStepArtifacts(); //Call PartitionReducer and StepListener(s)
invokeCoreStep();
} catch (final Exception e) {
// We're going to continue on so that we can execute the afterStep() and analyzer
try {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
markStepFailed();
} catch (final Throwable t) {
// Since the first one is the original first failure, let's rethrow t1 and not the second error,
// but we'll log a severe error pointing out that the failure didn't get persisted..
// We won't try to call the afterStep() in this case either.
rethrowWithMsg("ERROR. PERSISTING BATCH STATUS FAILED. STEP EXECUTION STATUS TABLES MIGHT HAVE CONSISTENCY ISSUES" +
"AND/OR UNEXPECTED ENTRIES.", t);
}
} catch (final Throwable t) {
LOGGER.log(Level.SEVERE, t.getMessage(), t);
markJobAndStepFailed();
}
//
// At this point we may have already failed the step, but we still try to invoke the end of step artifacts.
//
try {
//Call PartitionAnalyzer, PartitionReducer and StepListener(s)
invokePostStepArtifacts();
} catch (final Throwable t) {
LOGGER.log(Level.SEVERE, t.getMessage(), t);
markStepFailed();
}
//
// No more application code is on the path from here on out (excluding the call to the PartitionAnalyzer
// analyzeStatus(). If an exception bubbles up and leaves the statuses inconsistent or incorrect then so be it;
// maybe there's a runtime bug that will need to be fixed.
//
try {
// Now that all step-level artifacts have had a chance to run,
// we set the exit status to one of the defaults if it is still unset.
// This is going to be the very last sequence of calls from the step running on the main thread,
// since the call back to the partition analyzer only happens on the partition threads.
// On the partition threads, then, we harden the status at the partition level before we
// send it back to the main thread.
persistUserData();
transitionToFinalBatchStatus();
defaultExitStatusIfNecessary();
persistExitStatusAndEndTimestamp();
} catch (final Throwable t) {
// Don't let an exception caught here prevent us from persisting the failed batch status.
markJobAndStepFailed();
rethrowWithMsg("Failure ending step execution", t);
}
//
// Only happens on main thread.
//
sendStatusFromPartitionToAnalyzerIfPresent();
if (stepStatus.getBatchStatus().equals(BatchStatus.FAILED)) {
return new ExecutionStatus(ExtendedBatchStatus.EXCEPTION_THROWN, stepStatus.getExitStatus());
}
return new ExecutionStatus(ExtendedBatchStatus.NORMAL_COMPLETION, stepStatus.getExitStatus());
}