log.fine("Executing job " + jobId);
}
JobEntity job = commandContext.getDbEntityManager().selectById(JobEntity.class, jobId);
final CommandExecutor commandExecutor = Context.getProcessEngineConfiguration().getCommandExecutorTxRequiresNew();
final JobExecutorContext jobExecutorContext = Context.getJobExecutorContext();
if (job == null) {
if (jobExecutorContext != null) {
// CAM-1842
// Job was acquired but does not exist anymore. This is not a problem.
// It usually means that the job has been deleted after it was acquired which can happen if the
// the activity instance corresponding to the job is cancelled.
log.log(Level.FINE, "Job with Id " + jobId + " was acquired but cannot be found in database.");
return null;
} else {
throw new ProcessEngineException("No job found with id '" + jobId + "'");
}
}
// the failed job listener is responsible for decrementing the retries and logging the exception to the DB.
FailedJobListener failedJobListener = createFailedJobListener(commandExecutor);
// the listener is ALWAYS added to the transaction as SNYC on ROLLABCK. If the transaction does not rollback, it is ignored.
commandContext.getTransactionContext().addTransactionListener(
TransactionState.ROLLED_BACK,
failedJobListener);
// register as command context close lister to intercept exceptions on flush
commandContext.registerCommandContextListener(failedJobListener);
if (jobExecutorContext != null) { // if null, then we are not called by the job executor
jobExecutorContext.setCurrentJob(job);
}
try {
job.execute(commandContext);
return null;
} catch (RuntimeException exception) {
log.warning("Exception while excuting job '" + job + "': " + exception.getMessage());
// log the exception in the job
failedJobListener.setException(exception);
// throw the original exception to indicate the ExecuteJobCmd failed
throw exception;
} finally {
if (jobExecutorContext != null) {
jobExecutorContext.setCurrentJob(null);
}
}
}