/** * Validate StepExecution. At a minimum, JobId, StartTime, and Status cannot * be null. EndTime can be null for an unfinished job. * * @throws IllegalArgumentException */ private void validateStepExecution(StepExecution stepExecution) { Assert.notNull(stepExecution, "stepExecution is required"); Assert.notNull(stepExecution.getStepName(), "StepExecution step name cannot be null."); Assert.notNull(stepExecution.getStartTime(), "StepExecution start time cannot be null."); Assert.notNull(stepExecution.getStatus(), "StepExecution status cannot be null."); }
@Override public void abandonStepExecution() { StepExecution lastStepExecution = stepExecutionHolder.get(); if (lastStepExecution != null && lastStepExecution.getStatus().isGreaterThan(BatchStatus.STOPPING)) { lastStepExecution.upgradeStatus(BatchStatus.ABANDONED); jobRepository.update(lastStepExecution); } }
/** * Test method for * {@link org.springframework.batch.core.JobExecution#getStatus()}. */ @Test public void testDowngradeStatus() { execution.setStatus(BatchStatus.FAILED); execution.upgradeStatus(BatchStatus.COMPLETED); assertEquals(BatchStatus.FAILED, execution.getStatus()); }
@Test public void testAggregateStatusIncomplete() { stepExecution1.setStatus(BatchStatus.COMPLETED); stepExecution2.setStatus(BatchStatus.FAILED); aggregator.aggregate(result, Arrays.<StepExecution> asList(stepExecution1, stepExecution2)); assertNotNull(result); assertEquals(BatchStatus.FAILED, result.getStatus()); }
@Test public void testNonSkippable() throws Exception { writer.setExceptionType(RuntimeException.class); StepExecution stepExecution = launchStep("nonSkippableStep"); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals("[1, 2, 3]", writer.getWritten().toString()); assertEquals("[]", writer.getCommitted().toString()); }
@Test public void testSkippable() throws Exception { writer.setExceptionType(SkippableRuntimeException.class); StepExecution stepExecution = launchStep("skippableStep"); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 2, 3, 1, 2, 3, 4]", writer.getWritten().toString()); assertEquals("[1, 2, 4]", writer.getCommitted().toString()); }
@Test public void testRetryableButNotSkippable() throws Exception { writer.setExceptionType(RuntimeException.class); StepExecution stepExecution = launchStep("retryable"); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals("[1, 2, 3, 1, 2, 3]", writer.getWritten().toString()); // BATCH-1327: assertEquals("[]", writer.getCommitted().toString()); }
@Test public void testRetryableSkippable() throws Exception { writer.setExceptionType(SkippableRuntimeException.class); StepExecution stepExecution = launchStep("retryable"); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 2, 3, 1, 2, 3, 1, 2, 3, 4]", writer.getWritten().toString()); assertEquals("[1, 2, 4]", writer.getCommitted().toString()); }
@Test public void testNoRollbackFatalRollbackException() throws Exception { writer.setExceptionType(SkippableRuntimeException.class); StepExecution stepExecution = launchStep("noRollbackFatal"); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals("[1, 2, 3]", writer.getWritten().toString()); assertEquals("[]", writer.getCommitted().toString()); }
@Test public void testRetryableFatal() throws Exception { // User wants all exceptions to be retried, but only some are skippable // FatalRuntimeException is not skippable because it is fatal, but is a // subclass of another skippable writer.setExceptionType(FatalRuntimeException.class); StepExecution stepExecution = launchStep("retryable"); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); // BATCH-1333: assertEquals("[1, 2, 3, 1, 2, 3]", writer.getWritten().toString()); assertEquals("[]", writer.getCommitted().toString()); }
@Test public void testNoRollbackSkippableRollbackException() throws Exception { writer.setExceptionType(SkippableRuntimeException.class); StepExecution stepExecution = launchStep("noRollbackSkippable"); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 2, 3, 1, 2, 3, 4]", writer.getWritten().toString()); assertEquals("[1, 2, 4]", writer.getCommitted().toString()); }
@Test @DirtiesContext public void testNoRollbackTaskletNoRollbackException() throws Exception { tasklet.setExceptionType(SkippableRuntimeException.class); StepExecution stepExecution = launchStep("noRollbackTasklet"); // assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); // BATCH-1298: assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 1, 1, 1]", tasklet.getCommitted().toString()); }
@Test public void testRetryableFatalChecked() throws Exception { writer.setExceptionType(FatalSkippableException.class); StepExecution stepExecution = launchStep("retryable"); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); // BATCH-1333: assertEquals("[1, 2, 3, 1, 2, 3]", writer.getWritten().toString()); assertEquals("[]", writer.getCommitted().toString()); assertEquals(0, stepExecution.getWriteSkipCount()); }
@Test public void testNoRollbackSkippableNoRollbackException() throws Exception { writer.setExceptionType(FatalRuntimeException.class); StepExecution stepExecution = launchStep("noRollbackSkippable"); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); // BATCH-1332: assertEquals("[1, 2, 3, 1, 2, 3, 4]", writer.getWritten().toString()); // BATCH-1334: // Skipped but also committed (because it was marked as no-rollback) assertEquals("[1, 2, 3, 4]", writer.getCommitted().toString()); assertEquals(1, stepExecution.getWriteSkipCount()); }
@Test public void testAfterChunkListenerException() throws Exception{ factory.setListeners(new StepListener []{new ExceptionThrowingChunkListener(2)}); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(FAILED, stepExecution.getStatus()); assertEquals(FAILED.toString(), stepExecution.getExitStatus().getExitCode()); assertTrue(stepExecution.getCommitCount() > 0);//Make sure exception was thrown in after, not before Throwable e = stepExecution.getFailureExceptions().get(0); assertThat(e, instanceOf(FatalStepExecutionException.class)); assertThat(e.getCause(), instanceOf(IllegalArgumentException.class)); }
@Test public void testSkipInWriterNonTransactionalProcessor() throws Exception { writer.setFailures("4"); factory.setCommitInterval(30); factory.setProcessorTransactional(false); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 2, 3, 5]", writer.getCommitted().toString()); assertEquals("[1, 2, 3, 4, 1, 2, 3, 4, 5]", writer.getWritten().toString()); assertEquals("[1, 2, 3, 4, 5]", processor.getProcessed().toString()); }
@Test public void testMultipleSkipsInWriterNonTransactionalProcessor() throws Exception { writer.setFailures("2", "4"); factory.setCommitInterval(30); factory.setProcessorTransactional(false); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals("[1, 3, 5]", writer.getCommitted().toString()); assertEquals("[1, 2, 1, 2, 3, 4, 5]", writer.getWritten().toString()); assertEquals("[1, 2, 3, 4, 5]", processor.getProcessed().toString()); }
@Test public void testApplicationException() throws Exception { taskletStep.execute(stepExecution); assertEquals(FAILED, stepExecution.getStatus()); assertEquals(FAILED.toString(), stepExecution.getExitStatus().getExitCode()); }
@Test public void testFailTransitionDefaultStatus() throws Exception { JobExecution jobExecution = createJobExecution(); job.execute(jobExecution); assertEquals(1, stepNamesList.size()); assertTrue(stepNamesList.contains("s1")); assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus()); StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus()); assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus()); }
@Test public void test() throws Exception { JobRepository jobRepository = new MapJobRepositoryFactoryBean().getObject(); StepExecution execution = jobRepository.createJobExecution("foo", new JobParameters()).createStepExecution( "step"); jobRepository.add(execution); PlatformTransactionManager transactionManager = new ResourcelessTransactionManager(); TaskletStepBuilder builder = new StepBuilder("step").repository(jobRepository) .transactionManager(transactionManager).tasklet((contribution, chunkContext) -> null); builder.build().execute(execution); assertEquals(BatchStatus.COMPLETED, execution.getStatus()); }