BATCH-941: Applied patch

This commit is contained in:
dsyer
2008-12-30 17:42:48 +00:00
parent a6479602e2
commit f6131a0f40
5 changed files with 219 additions and 257 deletions

View File

@@ -11,7 +11,6 @@
<config>src/main/resources/jobs/multilineOrderIo.xml</config>
<config>src/main/resources/jobs/multilineOrderJob.xml</config>
<config>src/main/resources/jobs/tradeJob.xml</config>
<config>src/main/resources/jobs/tradeJobIo.xml</config>
<config>src/main/resources/jobs/restartSample.xml</config>
<config>src/main/resources/data-source-context.xml</config>
<config>src/main/resources/jobs/beanWrapperMapperSampleJob.xml</config>
@@ -179,7 +178,6 @@
<config>src/main/resources/data-source-context.xml</config>
<config>src/main/resources/data-source-context-init.xml</config>
<config>src/main/resources/jobs/tradeJob.xml</config>
<config>src/main/resources/jobs/tradeJobIo.xml</config>
<config>src/main/resources/simple-job-launcher-context.xml</config>
<config>src/main/resources/org/springframework/batch/sample/config/common-context.xml</config>
</configs>
@@ -374,7 +372,6 @@
<config>src/main/resources/jobs/skipSampleJob.xml</config>
<config>src/main/resources/org/springframework/batch/sample/config/common-context.xml</config>
<config>src/main/resources/data-source-context-init.xml</config>
<config>src/main/resources/jobs/tradeJobIo.xml</config>
<config>src/main/resources/skipSample-job-launcher-context.xml</config>
</configs>
</configSet>

View File

@@ -1,116 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
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/batch
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<import resource="tradeJobIo.xml" />
<batch:job id="skipJob" incrementer="incrementer">
<batch:step name="step1">
<batch:end on="FAILED" status="FAILED"/>
<batch:next on="COMPLETED WITH SKIPS" to="errorPrint1" />
<batch:next on="*" to="step2" />
</batch:step>
<batch:step name="errorPrint1">
<batch:next on="*" to="step2" />
</batch:step>
<batch:step name="step2">
<batch:next on="*" to="skipCheckingDecision" />
</batch:step>
<batch:decision id="skipCheckingDecision" decider="skipCheckingDecider">
<batch:next on="COMPLETED WITH SKIPS" to="errorPrint2" />
<batch:end on="*"/>
</batch:decision>
<batch:step name="errorPrint2" />
</batch:job>
<bean id="step1" parent="skipLimitStep">
<property name="skipLimit" value="1" />
<property name="itemReader" ref="fileItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
</property>
<property name="itemWriter">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeWriter"
p:dao-ref="tradeDao" />
</property>
<property name="listeners">
<list>
<bean class="org.springframework.batch.sample.common.SkipCheckingListener"/>
<ref bean="fileLocator"/>
</list>
</property>
</bean>
<bean id="step2" parent="skipLimitStep">
<property name="commitInterval" value="2" />
<property name="skipLimit" value="1" />
<!-- No rollback for exceptions that are marked with "+" in the tx attributes -->
<property name="skippableExceptionClasses">
<list>
<value>org.springframework.batch.item.validator.ValidationException</value>
<value>java.lang.RuntimeException</value>
</list>
</property>
<property name="itemReader" ref="tradeSqlItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
</property>
<property name="itemWriter" ref="itemTrackingWriter" />
<property name="listeners">
<list>
<bean class="org.springframework.batch.sample.common.SkipCheckingListener"/>
</list>
</property>
</bean>
<bean id="tradeSqlItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql"
value="SELECT isin, quantity, price, customer from TRADE" />
<property name="mapper">
<bean
class="org.springframework.batch.sample.domain.trade.internal.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.domain.trade.internal.CustomerCreditRowMapper" />
</property>
</bean>
<bean id="fileLocator" class="org.springframework.batch.core.resource.StepExecutionResourceProxy">
<property name="filePattern" value="classpath:data/skipJob/input/input%run.id(long)%.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 id="errorPrint" parent="taskletStep">
<property name="tasklet">
<bean class="org.springframework.batch.sample.common.ErrorLogTasklet">
<property name="dataSource" ref="dataSource"/>
</bean>
</property>
</bean>
<bean id="errorPrint1" parent="errorPrint"/>
<bean id="errorPrint2" parent="errorPrint"/>
<bean id="skipCheckingDecider" class="org.springframework.batch.sample.common.SkipCheckingDecider"/>
<bean id="incrementer" class="org.springframework.batch.sample.common.InfiniteLoopIncrementer"/>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
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/batch
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<batch:job id="skipJob" incrementer="incrementer">
<batch:step name="step1">
<batch:end on="FAILED" status="FAILED"/>
<batch:next on="COMPLETED WITH SKIPS" to="errorPrint1" />
<batch:next on="*" to="step2" />
</batch:step>
<batch:step name="errorPrint1" next="step2"/>
<batch:step name="step2" next="skipCheckingDecision"/>
<batch:decision id="skipCheckingDecision" decider="skipCheckingDecider">
<batch:next on="COMPLETED WITH SKIPS" to="errorPrint2" />
<batch:end on="*"/>
</batch:decision>
<batch:step name="errorPrint2" />
</batch:job>
<bean id="step1" parent="skipLimitStep">
<property name="skipLimit" value="1" />
<property name="itemReader" ref="fileItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
</property>
<property name="itemWriter">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeWriter" p:dao-ref="tradeDao" />
</property>
<property name="listeners">
<list>
<bean class="org.springframework.batch.sample.common.SkipCheckingListener"/>
</list>
</property>
</bean>
<bean id="step2" parent="skipLimitStep">
<property name="commitInterval" value="2" />
<property name="skipLimit" value="1" />
<property name="skippableExceptionClasses">
<list>
<value>org.springframework.batch.item.validator.ValidationException</value>
<value>java.lang.RuntimeException</value>
</list>
</property>
<property name="itemReader" ref="tradeSqlItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
</property>
<property name="itemWriter" ref="itemTrackingWriter" />
<property name="listeners">
<list>
<bean class="org.springframework.batch.sample.common.SkipCheckingListener"/>
</list>
</property>
</bean>
<bean id="fileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="classpath:/data/skipJob/input/input#{jobParameters[run.id]}.txt" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ISIN, Quantity, Price, Customer" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<bean class="org.springframework.batch.core.scope.StepScope" />
<bean id="tradeDao" class="org.springframework.batch.sample.domain.trade.internal.JdbcTradeDao"
p:dataSource-ref="dataSource">
<property name="incrementer">
<bean parent="incrementerParent">
<property name="incrementerName" value="TRADE_SEQ" />
</bean>
</property>
</bean>
<bean id="tradeSqlItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="SELECT isin, quantity, price, customer from TRADE" />
<property name="mapper">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeRowMapper" />
</property>
</bean>
<bean id="customerReportItemWriter"
class="org.springframework.batch.sample.domain.trade.internal.FlatFileCustomerCreditDao">
<property name="itemWriter">
<bean id="customerFlatFileOutputSource"
class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="target/test-outputs/20070122.testStream.CustomerReportStep.TEMP.txt" />
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
</property>
</bean>
</property>
</bean>
<bean id="errorPrint" parent="taskletStep">
<property name="tasklet">
<bean class="org.springframework.batch.sample.common.ErrorLogTasklet">
<property name="dataSource" ref="dataSource"/>
</bean>
</property>
</bean>
<bean id="errorPrint1" parent="errorPrint"/>
<bean id="errorPrint2" parent="errorPrint"/>
<bean id="skipCheckingDecider" class="org.springframework.batch.sample.common.SkipCheckingDecider"/>
<bean id="incrementer" class="org.springframework.batch.sample.common.InfiniteLoopIncrementer"/>
</beans>

View File

@@ -1,87 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:batch="http://www.springframework.org/schema/batch"
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/batch
http://www.springframework.org/schema/batch/spring-batch-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<import resource="tradeJobIo.xml" />
<batch:job id="tradeJob">
<batch:step name="step1" next="step2"/>
<batch:step name="step2" next="step3"/>
<batch:step name="step3"/>
</batch:job>
<bean id="tradeJob" parent="simpleJob">
<property name="steps">
<list>
<bean id="step1" parent="simpleStep">
<property name="transactionAttribute" value="PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED"/>
<property name="streams" ref="fileItemReader" />
<property name="itemReader" ref="fileItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.item.validator.ValidatingItemProcessor">
<constructor-arg ref="tradeValidator" />
</bean>
</property>
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.domain.trade.internal.TradeWriter"
p:dao-ref="tradeDao" />
</property>
</bean>
<bean id="step2" parent="simpleStep">
<property name="itemReader"
ref="tradeSqlItemReader" />
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.domain.trade.internal.CustomerUpdateWriter"
p:dao-ref="customerDao" />
</property>
</bean>
<bean id="step3" parent="simpleStep">
<property name="itemReader"
ref="customerSqlItemReader" />
<property name="itemWriter">
<bean
class="org.springframework.batch.sample.domain.trade.internal.CustomerCreditUpdateWriter"
p:dao-ref="customerReportItemWriter" />
</property>
</bean>
</list>
<bean id="step1" parent="simpleStep">
<property name="transactionAttribute" value="PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED"/>
<property name="streams" ref="fileItemReader" />
<property name="itemReader" ref="fileItemReader" />
<property name="itemProcessor">
<bean class="org.springframework.batch.item.validator.ValidatingItemProcessor">
<constructor-arg ref="tradeValidator" />
</bean>
</property>
<property name="itemWriter">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeWriter"
p:dao-ref="tradeDao" />
</property>
</bean>
<bean id="step2" parent="simpleStep">
<property name="itemReader" ref="tradeSqlItemReader" />
<property name="itemWriter">
<bean class="org.springframework.batch.sample.domain.trade.internal.CustomerUpdateWriter"
p:dao-ref="customerDao" />
</property>
</bean>
<bean id="step3" parent="simpleStep">
<property name="itemReader" ref="customerSqlItemReader" />
<property name="itemWriter">
<bean class="org.springframework.batch.sample.domain.trade.internal.CustomerCreditUpdateWriter"
p:dao-ref="customerReportItemWriter" />
</property>
</bean>
<bean id="tradeSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<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="sql" value="SELECT id, quantity, price, customer from TRADE" />
<property name="mapper">
<bean
class="org.springframework.batch.sample.domain.trade.internal.TradeRowMapper" />
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeRowMapper" />
</property>
</bean>
<bean id="customerSqlItemReader"
class="org.springframework.batch.item.database.JdbcCursorItemReader">
<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="sql" value="SELECT id, name, credit FROM customer " />
<property name="mapper">
<bean
class="org.springframework.batch.sample.domain.trade.internal.CustomerCreditRowMapper" />
<bean class="org.springframework.batch.sample.domain.trade.internal.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 id="tradeDao" class="org.springframework.batch.sample.domain.trade.internal.JdbcTradeDao"
p:dataSource-ref="dataSource">
<property name="incrementer">
<bean parent="incrementerParent">
<property name="incrementerName" value="TRADE_SEQ" />
</bean>
</property>
</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 id="customerDao" class="org.springframework.batch.sample.domain.trade.internal.JdbcCustomerDebitDao"
p:dataSource-ref="dataSource" />
<bean id="customerReportItemWriter" class="org.springframework.batch.sample.domain.trade.internal.FlatFileCustomerCreditDao">
<property name="itemWriter">
<bean class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="target/test-outputs/20070122.testStream.CustomerReportStep.TEMP.txt"/>
<property name="lineAggregator">
<bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
</property>
</bean>
</property>
</bean>
<bean id="fileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="classpath:data/tradeJob/input/20070122.teststream.ImportTradeDataStep.txt" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ISIN, Quantity, Price, Customer" />
</bean>
</property>
<property name="fieldSetMapper">
<bean class="org.springframework.batch.sample.domain.trade.internal.TradeFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="tradeValidator" class="org.springframework.batch.item.validator.SpringValidator">
<property name="validator">
<bean class="org.springmodules.validation.valang.ValangValidator">
<property name="valang">
<value>
<![CDATA[{ isin : length(?) < 13 : 'ISIN too long' : 'isin_length' : 12}]]>
</value>
</property>
</bean>
</property>
</bean>
</beans>

View File

@@ -1,76 +0,0 @@
<?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.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean class="org.springframework.batch.sample.domain.trade.internal.JdbcTradeDao"
id="tradeDao" p:dataSource-ref="dataSource">
<property name="incrementer">
<bean parent="incrementerParent">
<property name="incrementerName" value="TRADE_SEQ" />
</bean>
</property>
</bean>
<bean
class="org.springframework.batch.sample.domain.trade.internal.JdbcCustomerDebitDao"
id="customerDao" p:dataSource-ref="dataSource" />
<bean
class="org.springframework.batch.sample.domain.trade.internal.FlatFileCustomerCreditDao"
id="customerReportItemWriter">
<property name="itemWriter">
<bean
class="org.springframework.batch.item.file.FlatFileItemWriter"
id="customerFlatFileOutputSource">
<property name="resource" ref="customerFileLocator" />
<property name="lineAggregator">
<bean
class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
</property>
</bean>
</property>
</bean>
<bean class="org.springframework.batch.item.file.FlatFileItemReader"
id="fileItemReader">
<property name="resource" ref="fileLocator" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="tradeFileDescriptor" />
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.sample.domain.trade.internal.TradeFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="tradeFileDescriptor"
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="ISIN, Quantity, Price, Customer" />
</bean>
<bean id="tradeValidator"
class="org.springframework.batch.item.validator.SpringValidator">
<property name="validator">
<bean
class="org.springmodules.validation.valang.ValangValidator">
<property name="valang">
<value>
<![CDATA[
{ isin : length(?) < 13 : 'ISIN too long' : 'isin_length' : 12}
]]>
</value>
</property>
</bean>
</property>
</bean>
</beans>

View File

@@ -36,7 +36,6 @@ import org.junit.runner.RunWith;
import org.springframework.batch.sample.domain.trade.Trade;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
@@ -126,13 +125,9 @@ public class TradeJobFunctionalTests extends AbstractValidatingBatchLauncherTest
assertEquals(customers.size(), activeRow);
// check content of the output file
// Clean up
((FileSystemResource)applicationContext.getBean("customerFileLocator")).getFile().delete();
}
protected void validatePreConditions() {
assertTrue(((Resource)applicationContext.getBean("fileLocator")).exists());
}
private static class Customer {