/** * Extract the stack trace from the throwable provided and append it to * the exist description. * * @param throwable {@link Throwable} instance containing the stack trace. * @return a new ExitStatus with the stack trace appended */ public ExitStatus addExitDescription(Throwable throwable) { StringWriter writer = new StringWriter(); throwable.printStackTrace(new PrintWriter(writer)); String message = writer.toString(); return addExitDescription(message); }
@Override public ExitStatus afterStep(StepExecution stepExecution) { return ExitStatus.FAILED.addExitDescription("FOO"); } });
/** * Default mapping from throwable to {@link ExitStatus}. Clients can modify the exit code using a * {@link StepExecutionListener}. * * @param ex the cause of the failure * @return an {@link ExitStatus} */ private ExitStatus getDefaultExitStatusForFailure(Throwable ex) { ExitStatus exitStatus; if (ex instanceof JobInterruptedException || ex.getCause() instanceof JobInterruptedException) { exitStatus = ExitStatus.STOPPED.addExitDescription(JobInterruptedException.class.getName()); } else if (ex instanceof NoSuchJobException || ex.getCause() instanceof NoSuchJobException) { exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex.getClass().getName()); } else { exitStatus = ExitStatus.FAILED.addExitDescription(ex); } return exitStatus; }
/** * Default mapping from throwable to {@link ExitStatus}. * * @param ex the cause of the failure * @param execution the {@link JobExecution} instance. * @return an {@link ExitStatus} */ protected ExitStatus getDefaultExitStatusForFailure(Throwable ex, JobExecution execution) { ExitStatus exitStatus; if (ex instanceof JobInterruptedException || ex.getCause() instanceof JobInterruptedException) { exitStatus = ExitStatus.STOPPED .addExitDescription(JobInterruptedException.class.getName()); } else if (ex instanceof NoSuchJobException || ex.getCause() instanceof NoSuchJobException) { exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex .getClass().getName()); } else { exitStatus = ExitStatus.FAILED.addExitDescription(ex); } return exitStatus; }
/** * Default mapping from throwable to {@link ExitStatus}. * * @param ex the cause of the failure * @return an {@link ExitStatus} */ @Override protected ExitStatus getDefaultExitStatusForFailure(Throwable ex, JobExecution execution) { if(!ExitStatus.isNonDefaultExitStatus(execution.getExitStatus())) { return execution.getExitStatus(); } else { ExitStatus exitStatus; if (ex instanceof JobInterruptedException || ex.getCause() instanceof JobInterruptedException) { exitStatus = ExitStatus.STOPPED .addExitDescription(JobInterruptedException.class.getName()); } else if (ex instanceof NoSuchJobException || ex.getCause() instanceof NoSuchJobException) { exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex .getClass().getName()); } else { exitStatus = ExitStatus.FAILED.addExitDescription(ex); } return exitStatus; } } }
@Override protected Set<StepExecution> doHandle(StepExecution masterStepExecution, Set<StepExecution> partitionStepExecutions) throws Exception { Assert.notNull(step, "A Step must be provided."); final Set<Future<StepExecution>> tasks = new HashSet<>(getGridSize()); final Set<StepExecution> result = new HashSet<>(); for (final StepExecution stepExecution : partitionStepExecutions) { final FutureTask<StepExecution> task = createTask(step, stepExecution); try { taskExecutor.execute(task); tasks.add(task); } catch (TaskRejectedException e) { // couldn't execute one of the tasks ExitStatus exitStatus = ExitStatus.FAILED .addExitDescription("TaskExecutor rejected the task for this step."); /* * Set the status in case the caller is tracking it through the * JobExecution. */ stepExecution.setStatus(BatchStatus.FAILED); stepExecution.setExitStatus(exitStatus); result.add(stepExecution); } } for (Future<StepExecution> task : tasks) { result.add(task.get()); } return result; }
logger.debug("Detected failure waiting for results in step listener.", e); stepExecution.setStatus(BatchStatus.FAILED); return ExitStatus.FAILED.addExitDescription(e.getClass().getName() + ": " + e.getMessage()); return ExitStatus.FAILED.addExitDescription("Timed out waiting for " + localState.getExpecting() + " backlog at end of step"); return ExitStatus.COMPLETED.addExitDescription("Waited for " + expecting + " results.");
return this; ExitStatus result = addExitDescription(status.exitDescription); if (compareTo(status) < 0) { result = result.replaceExitCode(status.exitCode);
@Test public void testAddEmptyExitDescription() throws Exception { ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription((String)null); assertEquals("Foo", status.getExitDescription()); }
@Test public void testAddExitDescriptionToSameStatus() throws Exception { ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription("Foo"); assertTrue(ExitStatus.EXECUTING != status); assertEquals("Foo", status.getExitDescription()); }
@Test public void testAddExitDescriptionWIthStacktrace() throws Exception { ExitStatus status = ExitStatus.EXECUTING.addExitDescription(new RuntimeException("Foo")); assertTrue(ExitStatus.EXECUTING != status); String description = status.getExitDescription(); assertTrue("Wrong description: "+description, description.contains("Foo")); assertTrue("Wrong description: "+description, description.contains("RuntimeException")); }
@Transactional @Test public void testUpdateJobExecutionWithLongExitCode() { assertTrue(LONG_STRING.length() > 250); ((JdbcJobExecutionDao) jobExecutionDao).setExitMessageLength(250); jobExecution.setExitStatus(ExitStatus.COMPLETED .addExitDescription(LONG_STRING)); jobExecutionDao.updateJobExecution(jobExecution); List<Map<String, Object>> executions = jdbcTemplate.queryForList( "SELECT * FROM BATCH_JOB_EXECUTION where JOB_INSTANCE_ID=?", jobInstance.getId()); assertEquals(1, executions.size()); assertEquals(LONG_STRING.substring(0, 250), executions.get(0) .get("EXIT_MESSAGE")); }
.addExitDescription("TaskExecutor rejected the task for this step.");
@Test public void testAddExitDescription() throws Exception { ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo"); assertTrue(ExitStatus.EXECUTING != status); assertEquals("Foo", status.getExitDescription()); }
jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
ExitStatus exitStatus = execution.getExitStatus(); ExitStatus newExitStatus = ExitStatus.NOOP.addExitDescription("All steps already completed or no steps configured for this job."); execution.setExitStatus(exitStatus.and(newExitStatus));
jobExecution.upgradeStatus(BatchStatus.FAILED); if (jobExecution.getExitStatus().equals(ExitStatus.UNKNOWN)) { jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
/** * Long exit descriptions are truncated on both save and update. */ @Transactional @Test public void testTruncateExitDescription() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100; i++) { sb.append("too long exit description"); } String longDescription = sb.toString(); ExitStatus exitStatus = ExitStatus.FAILED.addExitDescription(longDescription); stepExecution.setExitStatus(exitStatus); ((JdbcStepExecutionDao) dao).setExitMessageLength(250); dao.saveStepExecution(stepExecution); StepExecution retrievedAfterSave = dao.getStepExecution(jobExecution, stepExecution.getId()); assertTrue("Exit description should be truncated", retrievedAfterSave.getExitStatus().getExitDescription() .length() < stepExecution.getExitStatus().getExitDescription().length()); dao.updateStepExecution(stepExecution); StepExecution retrievedAfterUpdate = dao.getStepExecution(jobExecution, stepExecution.getId()); assertTrue("Exit description should be truncated", retrievedAfterUpdate.getExitStatus().getExitDescription() .length() < stepExecution.getExitStatus().getExitDescription().length()); }
jobExecution.upgradeStatus(BatchStatus.FAILED); if (jobExecution.getExitStatus().equals(ExitStatus.UNKNOWN)) { jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
@Override public JobParameters getJobParameters(Job job, StepExecution stepExecution) { Properties properties = new Properties(); try (Reader reader = new FileReader(resource.getFile())) { properties.load(reader); } catch (IOException e) { if (stepExecution != null) { stepExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e)); } } return new DefaultJobParametersConverter().getJobParameters(properties); }