diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/ItemOrientedStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/ItemOrientedStep.java index fa1f81d44..e23aad41f 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/ItemOrientedStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/ItemOrientedStep.java @@ -318,6 +318,8 @@ public class ItemOrientedStep extends AbstractStep { logger.error("Fatal error detected during commit."); throw new FatalException("Fatal error detected during commit", e); } + + getJobRepository().saveOrUpdate(stepExecution); } catch (Error e) { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java index ac20e5cb8..3f72cc338 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/ItemOrientedStepTests.java @@ -684,8 +684,7 @@ public class ItemOrientedStepTests extends TestCase { String msg = stepExecution.getExitStatus().getExitDescription(); assertEquals("", msg); msg = ex.getMessage(); - assertTrue("Message does not contain 'closing step': " + msg, contains(msg, - "closing step")); + assertTrue("Message does not contain 'closing step': " + msg, contains(msg, "closing step")); // The original rollback was caused by this one: assertEquals("Bar", ex.getCause().getMessage()); } @@ -795,6 +794,36 @@ public class ItemOrientedStepTests extends TestCase { } + public void testStepExecutionUpdates() throws Exception { + + JobExecution jobExecution = new JobExecution(jobInstance); + StepExecution stepExecution = new StepExecution(itemOrientedStep.getName(), jobExecution); + + itemOrientedStep.setStepOperations(new RepeatTemplate()); + + JobRepositoryStub jobRepository = new JobRepositoryStub(); + itemOrientedStep.setJobRepository(jobRepository); + + itemOrientedStep.execute(stepExecution); + + assertEquals(3, processed.size()); + assertEquals(3, stepExecution.getItemCount().intValue()); + assertTrue(3 <= jobRepository.updateCount); + } + + private static class JobRepositoryStub extends JobRepositorySupport { + + private int updateCount = -1; + + public void saveOrUpdate(StepExecution stepExecution) { + updateCount++; + if (updateCount <= 3) { + assertEquals(Integer.valueOf(updateCount), stepExecution.getItemCount()); + } + } + + } + private boolean contains(String str, String searchStr) { return str.indexOf(searchStr) != -1; }