RESOLVED - BATCH-554: *StepFactoryBeans should have a list of exceptions that do and don't cause rollback.

added sample for noRollbackForExceptionClasses (2nd step in skipSample)
This commit is contained in:
robokaso
2008-05-13 08:05:00 +00:00
parent fad3686c2d
commit ed7c437ce8
3 changed files with 121 additions and 69 deletions

View File

@@ -0,0 +1,36 @@
package org.springframework.batch.sample.item.writer;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.AbstractItemWriter;
import org.springframework.batch.item.validator.ValidationException;
/**
* Remembers all items written - useful for testing.
*/
public class ItemTrackingItemWriter extends AbstractItemWriter {
private List items = new ArrayList();
private int failure = -1;
private int counter = 0;
public void write(Object item) throws Exception {
items.add(item);
if (++counter == failure) {
throw new ValidationException("validation failed");
}
}
public List getItems() {
return items;
}
public void setValidationFailure(int failure) {
this.failure = failure;
}
}

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
@@ -17,64 +17,70 @@
<property name="skipLimit" value="1" />
<property name="streams" ref="fileItemReader" />
<property name="itemReader">
<bean
class="org.springframework.batch.item.validator.ValidatingItemReader">
<property name="itemReader"
ref="fileItemReader" />
<property name="validator"
ref="tradeValidator" />
</bean>
</property>
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.item.writer.TradeWriter"
p:dao-ref="tradeDao" p:failure="3" />
</property>
</bean>
<bean id="step2" parent="simpleStep">
<property name="itemReader"
ref="tradeSqlItemReader" />
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.item.writer.DummyItemWriter" />
</property>
</bean>
</list>
</property>
</bean>
<bean id="tradeSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="SELECT id, quantity, price, customer from TRADE" />
<property name="mapper">
<bean
class="org.springframework.batch.sample.mapping.TradeRowMapper" />
</property>
</bean>
<bean id="customerSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="SELECT id, name, credit FROM customer " />
<property name="mapper">
<bean
class="org.springframework.batch.sample.mapping.CustomerCreditRowMapper" />
</property>
</bean>
<bean id="fileLocator"
class="org.springframework.core.io.ClassPathResource">
<constructor-arg type="java.lang.String"
value="data/tradeJob/input/20070122.teststream.ImportTradeDataStep.txt" />
</bean>
<bean id="customerFileLocator"
class="org.springframework.core.io.FileSystemResource">
<constructor-arg type="java.lang.String"
value="target/test-outputs/20070122.testStream.CustomerReportStep.TEMP.txt" />
</bean>
<bean
class="org.springframework.batch.item.validator.ValidatingItemReader">
<property name="itemReader"
ref="fileItemReader" />
<property name="validator"
ref="tradeValidator" />
</bean>
</property>
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.item.writer.TradeWriter"
p:dao-ref="tradeDao" p:failure="3" />
</property>
</bean>
<bean id="step2" parent="skipLimitStep">
<property name="commitInterval" value="2" />
<property name="skipLimit" value="1" />
<property name="noRollbackForExceptionClasses"
value="org.springframework.batch.item.validator.ValidationException" />
<property name="itemReader"
ref="tradeSqlItemReader" />
<property name="itemWriter"
ref="itemTrackingWriter" />
</bean>
</list>
</property>
</bean>
<bean id="itemTrackingWriter"
class="org.springframework.batch.sample.item.writer.ItemTrackingItemWriter"
p:validationFailure="2" />
<bean id="tradeSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="SELECT id, quantity, price, customer from TRADE" />
<property name="mapper">
<bean
class="org.springframework.batch.sample.mapping.TradeRowMapper" />
</property>
</bean>
<bean id="customerSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="SELECT id, name, credit FROM customer " />
<property name="mapper">
<bean
class="org.springframework.batch.sample.mapping.CustomerCreditRowMapper" />
</property>
</bean>
<bean id="fileLocator"
class="org.springframework.core.io.ClassPathResource">
<constructor-arg type="java.lang.String"
value="data/tradeJob/input/20070122.teststream.ImportTradeDataStep.txt" />
</bean>
<bean id="customerFileLocator"
class="org.springframework.core.io.FileSystemResource">
<constructor-arg type="java.lang.String"
value="target/test-outputs/20070122.testStream.CustomerReportStep.TEMP.txt" />
</bean>
</beans>

View File

@@ -1,7 +1,6 @@
package org.springframework.batch.sample;
import javax.sql.DataSource;
import org.springframework.batch.sample.item.writer.ItemTrackingItemWriter;
import org.springframework.jdbc.core.JdbcTemplate;
/**
@@ -16,8 +15,16 @@ public class SkipSampleFunctionalTests extends AbstractValidatingBatchLauncherTe
JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
ItemTrackingItemWriter writer;
// auto-injection
public void setWriter(ItemTrackingItemWriter writer) {
this.writer = writer;
}
// auto-injection
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
protected void onSetUp() throws Exception {
@@ -28,6 +35,9 @@ public class SkipSampleFunctionalTests extends AbstractValidatingBatchLauncherTe
int after = jdbcTemplate.queryForInt("SELECT COUNT(*) from TRADE");
// 5 input records, 1 skipped => 4 written to output
assertEquals(before + 4, after);
// no item was processed twice (no rollback occurred despite error on write)
assertEquals(after, writer.getItems().size());
}
}