From d2a201725167f62ce93b64a9f954b486ba37fe19 Mon Sep 17 00:00:00 2001 From: robokaso Date: Tue, 7 Oct 2008 07:56:00 +0000 Subject: [PATCH] RESOLVED - BATCH-832: DefaultTransactionAttribute is inappropriate for TaskletStep always rollback by default --- .../step/item/AbstractStepFactoryBean.java | 8 ++++- .../core/step/item/ItemOrientedStep.java | 8 ++++- .../item/SkipLimitStepFactoryBeanTests.java | 34 ++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java index bca952f2c..0515af38c 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java @@ -202,7 +202,13 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw * @return the transactionAttribute */ protected TransactionAttribute getTransactionAttribute() { - return transactionAttribute!=null?transactionAttribute:new DefaultTransactionAttribute(); + return transactionAttribute!=null?transactionAttribute:new DefaultTransactionAttribute() { + + public boolean rollbackOn(Throwable ex) { + return true; + } + + }; } /** 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 6edb681f1..10351ef43 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 @@ -79,7 +79,13 @@ public class ItemOrientedStep extends AbstractStep { private PlatformTransactionManager transactionManager; - private TransactionAttribute transactionAttribute = new DefaultTransactionAttribute(); + private TransactionAttribute transactionAttribute = new DefaultTransactionAttribute() { + + public boolean rollbackOn(Throwable ex) { + return true; + } + + }; private ItemHandler itemHandler; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBeanTests.java index 29ceaf1f1..c26c358b4 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SkipLimitStepFactoryBeanTests.java @@ -123,7 +123,7 @@ public class SkipLimitStepFactoryBeanTests extends TestCase { assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals(1, stepExecution.getItemCount().intValue()); } - + } /** @@ -330,6 +330,38 @@ public class SkipLimitStepFactoryBeanTests extends TestCase { assertEquals(4, count); } + /** + * Both checked and unchecked exceptions should cause rollback by default + * i.e. EJB-style {@link DefaultTransactionAttribute} is inappropriate. + */ + public void testRollback() throws Exception { + + factory.setSkippableExceptionClasses(new Class[] { Exception.class }); + factory.setSkipLimit(2); + factory.setItemReader(new SkipReaderStub(StringUtils.commaDelimitedListToStringArray("1,2,3"), Collections.EMPTY_SET)); + factory.setItemWriter(new ItemWriterAdapter() { + int count = 0; + public void write(Object item) throws Exception { + count++; + if (count == 1) { + throw new RuntimeException(); + } + if (count == 2) { + throw new Exception(); + } + } + + }); + + AbstractStep step = (AbstractStep) factory.getObject(); + + StepExecution stepExecution = new StepExecution(step.getName(), jobExecution); + step.execute(stepExecution); + + assertEquals(2, stepExecution.getSkipCount()); + assertEquals(2, stepExecution.getRollbackCount().intValue()); + } + /** * Simple item reader that supports skip functionality. */