From 7d5e2d14c1cda0f1cbcd35785a5fc81384d8cb5f Mon Sep 17 00:00:00 2001 From: lucasward Date: Fri, 7 Nov 2008 20:46:57 +0000 Subject: [PATCH] BATCH-676: Added sample jobs for non sequential execution and decisions --- spring-batch-samples/pom.xml | 5 + .../internal/ErrorLogWriter.java | 26 ++++ .../internal/SkipCheckingDecider.java | 18 +++ .../internal/SkipCheckingListener.java | 20 +++ .../main/resources/business-schema-db2.sql | 7 +- .../main/resources/business-schema-derby.sql | 7 +- .../main/resources/business-schema-hsqldb.sql | 7 +- .../main/resources/business-schema-mysql.sql | 7 +- .../resources/business-schema-oracle10g.sql | 7 +- .../resources/business-schema-postgresql.sql | 7 +- .../resources/business-schema-sqlserver.sql | 13 +- .../main/resources/business-schema-sybase.sql | 13 +- .../nonSequentialJob/input/games-small.csv | 79 +++++++++++ .../input/player-containsBadRecords.csv | 20 +++ .../nonSequentialJob/input/player-small.csv | 20 +++ .../jobs/nonSequentialDecisionJob.xml | 48 +++++++ .../resources/jobs/nonSequentialJob-base.xml | 124 ++++++++++++++++++ .../main/resources/jobs/nonSequentialJob.xml | 41 ++++++ .../src/main/sql/destroy.sql.vpp | 1 + .../src/main/sql/init.sql.vpp | 6 +- ...nSequentialDecisionJobFunctionalTests.java | 37 ++++++ .../NonSequentialJobFunctionalTests.java | 37 ++++++ 22 files changed, 535 insertions(+), 15 deletions(-) create mode 100644 spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/ErrorLogWriter.java create mode 100644 spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingDecider.java create mode 100644 spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingListener.java create mode 100644 spring-batch-samples/src/main/resources/data/nonSequentialJob/input/games-small.csv create mode 100644 spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-containsBadRecords.csv create mode 100644 spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-small.csv create mode 100644 spring-batch-samples/src/main/resources/jobs/nonSequentialDecisionJob.xml create mode 100644 spring-batch-samples/src/main/resources/jobs/nonSequentialJob-base.xml create mode 100644 spring-batch-samples/src/main/resources/jobs/nonSequentialJob.xml create mode 100644 spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialDecisionJobFunctionalTests.java create mode 100644 spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialJobFunctionalTests.java diff --git a/spring-batch-samples/pom.xml b/spring-batch-samples/pom.xml index f98534136..9e024c0f3 100644 --- a/spring-batch-samples/pom.xml +++ b/spring-batch-samples/pom.xml @@ -21,6 +21,11 @@ org.springframework.batch.core ${project.version} + + org.springframework.batch + org.springframework.batch.test + ${project.version} + org.aspectj com.springsource.org.aspectj.runtime diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/ErrorLogWriter.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/ErrorLogWriter.java new file mode 100644 index 000000000..06c532f57 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/ErrorLogWriter.java @@ -0,0 +1,26 @@ +package org.springframework.batch.sample.domain.nonSequential.internal; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.core.AttributeAccessor; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +public class ErrorLogWriter implements Tasklet { + + protected final Log logger = LogFactory.getLog(getClass()); + private SimpleJdbcTemplate simpleJdbcTemplate; + + public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception { + this.simpleJdbcTemplate.update("insert into ERROR_LOG values ('Some records were skipped!')"); + return ExitStatus.FINISHED; + } + + public void setDataSource(DataSource dataSource) { + this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); + } +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingDecider.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingDecider.java new file mode 100644 index 000000000..c94fe516b --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingDecider.java @@ -0,0 +1,18 @@ +package org.springframework.batch.sample.domain.nonSequential.internal; + +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.job.flow.support.state.JobExecutionDecider; + +public class SkipCheckingDecider implements JobExecutionDecider { + + public String decide(JobExecution jobExecution, StepExecution stepExecution) { + if (!stepExecution.getExitStatus().getExitCode().equals(ExitStatus.FAILED.getExitCode()) + && stepExecution.getSkipCount() > 0) { + return "COMPLETED WITH SKIPS"; + } else { + return ExitStatus.FINISHED.getExitCode(); + } + } +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingListener.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingListener.java new file mode 100644 index 000000000..56c28c0a8 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/nonSequential/internal/SkipCheckingListener.java @@ -0,0 +1,20 @@ +package org.springframework.batch.sample.domain.nonSequential.internal; + +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.StepExecutionListener; + +public class SkipCheckingListener implements StepExecutionListener { + + public ExitStatus afterStep(StepExecution stepExecution) { + if (!stepExecution.getExitStatus().getExitCode().equals(ExitStatus.FAILED.getExitCode()) + && stepExecution.getSkipCount() > 0) { + return new ExitStatus(false, "COMPLETED WITH SKIPS"); + } else { + return null; + } + } + + public void beforeStep(StepExecution stepExecution) { + } +} diff --git a/spring-batch-samples/src/main/resources/business-schema-db2.sql b/spring-batch-samples/src/main/resources/business-schema-db2.sql index 6c24cc01b..5da631d16 100644 --- a/spring-batch-samples/src/main/resources/business-schema-db2.sql +++ b/spring-batch-samples/src/main/resources/business-schema-db2.sql @@ -8,6 +8,7 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-derby.sql b/spring-batch-samples/src/main/resources/business-schema-derby.sql index 2f921d970..301125ea6 100644 --- a/spring-batch-samples/src/main/resources/business-schema-derby.sql +++ b/spring-batch-samples/src/main/resources/business-schema-derby.sql @@ -8,6 +8,7 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-hsqldb.sql b/spring-batch-samples/src/main/resources/business-schema-hsqldb.sql index 72b6d7ddd..aef60cd13 100644 --- a/spring-batch-samples/src/main/resources/business-schema-hsqldb.sql +++ b/spring-batch-samples/src/main/resources/business-schema-hsqldb.sql @@ -8,6 +8,7 @@ DROP TABLE CUSTOMER IF EXISTS; DROP TABLE PLAYERS IF EXISTS; DROP TABLE GAMES IF EXISTS; DROP TABLE PLAYER_SUMMARY IF EXISTS; +DROP TABLE ERROR_LOG IF EXISTS; -- Autogenerated: do not edit this file @@ -89,4 +90,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-mysql.sql b/spring-batch-samples/src/main/resources/business-schema-mysql.sql index 751355b9a..f90197d03 100644 --- a/spring-batch-samples/src/main/resources/business-schema-mysql.sql +++ b/spring-batch-samples/src/main/resources/business-schema-mysql.sql @@ -8,6 +8,7 @@ DROP TABLE IF EXISTS CUSTOMER ; DROP TABLE IF EXISTS PLAYERS ; DROP TABLE IF EXISTS GAMES ; DROP TABLE IF EXISTS PLAYER_SUMMARY ; +DROP TABLE IF EXISTS ERROR_LOG ; -- Autogenerated: do not edit this file @@ -86,4 +87,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) type=InnoDB; \ No newline at end of file +) type=InnoDB; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) type=InnoDB; diff --git a/spring-batch-samples/src/main/resources/business-schema-oracle10g.sql b/spring-batch-samples/src/main/resources/business-schema-oracle10g.sql index 84f4a6cb4..99e46672c 100644 --- a/spring-batch-samples/src/main/resources/business-schema-oracle10g.sql +++ b/spring-batch-samples/src/main/resources/business-schema-oracle10g.sql @@ -8,6 +8,7 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS NUMBER(38) NOT NULL , RECEPTIONS_YARDS NUMBER(38) NOT NULL , TOTAL_TD NUMBER(38) NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-postgresql.sql b/spring-batch-samples/src/main/resources/business-schema-postgresql.sql index 27104867a..9d5930974 100644 --- a/spring-batch-samples/src/main/resources/business-schema-postgresql.sql +++ b/spring-batch-samples/src/main/resources/business-schema-postgresql.sql @@ -8,6 +8,7 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql b/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql index ee806c8a1..9b7ccb213 100644 --- a/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql +++ b/spring-batch-samples/src/main/resources/business-schema-sqlserver.sql @@ -8,12 +8,13 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file -CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); -CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); -CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); +CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); +CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); +CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); CREATE TABLE BATCH_STAGING ( ID BIGINT NOT NULL PRIMARY KEY , @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/business-schema-sybase.sql b/spring-batch-samples/src/main/resources/business-schema-sybase.sql index 5b24d8fe2..a9aeb1919 100644 --- a/spring-batch-samples/src/main/resources/business-schema-sybase.sql +++ b/spring-batch-samples/src/main/resources/business-schema-sybase.sql @@ -8,12 +8,13 @@ DROP TABLE CUSTOMER ; DROP TABLE PLAYERS ; DROP TABLE GAMES ; DROP TABLE PLAYER_SUMMARY ; +DROP TABLE ERROR_LOG ; -- Autogenerated: do not edit this file -CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); -CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); -CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); +CREATE TABLE CUSTOMER_SEQ (ID BIGINT IDENTITY); +CREATE TABLE BATCH_STAGING_SEQ (ID BIGINT IDENTITY); +CREATE TABLE TRADE_SEQ (ID BIGINT IDENTITY); CREATE TABLE BATCH_STAGING ( ID BIGINT NOT NULL PRIMARY KEY , @@ -83,4 +84,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS BIGINT NOT NULL , RECEPTIONS_YARDS BIGINT NOT NULL , TOTAL_TD BIGINT NOT NULL -) ; \ No newline at end of file +) ; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) ; diff --git a/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/games-small.csv b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/games-small.csv new file mode 100644 index 000000000..be449f5ac --- /dev/null +++ b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/games-small.csv @@ -0,0 +1,79 @@ +AbduKa00,1998,mia,6,jax,0,0,0,0,0,21,43,0,0,1 +AbduKa00,1998,mia,7,ram,0,0,0,0,0,17,59,2,12,0 +AbduKa00,1998,mia,8,nwe,0,0,0,0,0,21,56,3,12,0 +AbduKa00,1998,mia,9,buf,0,0,0,0,0,22,97,2,9,1 +AbduKa00,1999,cle,10,pit,0,0,0,0,0,18,56,1,7,0 +AbduKa00,1999,cle,11,car,0,0,0,0,0,7,11,2,2,0 +AbduKa00,1999,cle,12,oti,0,0,0,0,0,15,35,1,1,0 +AbduKa00,1999,cle,13,sdg,0,0,0,0,0,10,29,1,21,0 +AbduKa00,1999,cle,14,cin,0,0,0,0,0,5,10,2,7,1 +AbduKa00,1999,cle,15,jax,0,0,0,0,0,13,36,1,4,0 +AbduKa00,1999,cle,16,clt,0,0,0,0,0,19,84,2,7,0 +AbduKa00,1999,cle,1,den,0,0,0,0,0,16,60,1,7,1 +AbduKa00,1999,cle,2,crd,0,0,0,0,0,9,33,3,18,0 +AbduKa00,1999,cle,4,buf,0,0,0,0,0,3,2,0,0,0 +AbduKa00,1999,cle,7,ram,0,0,0,0,0,6,27,2,8,0 +AbduKa00,1999,cle,8,nor,0,0,0,0,0,13,39,0,0,0 +AbduKa00,1999,cle,9,rav,0,0,0,0,0,9,23,1,2,0 +AbduKa00,2000,clt,1,kan,0,0,0,0,0,1,-2,0,0,0 +AbduRa00,1999,tam,13,min,0,0,0,0,0,0,0,1,3,0 +AbduRa00,1999,tam,15,rai,0,0,0,0,0,4,12,0,0,0 +AbduRa00,1999,tam,1,nyg,0,0,0,0,0,1,0,0,0,0 +AbduRa00,1999,tam,8,det,0,0,0,0,0,0,0,1,8,0 +AbduRa00,2000,tam,12,chi,0,0,0,0,0,2,18,0,0,0 +AbduRa00,2000,tam,14,dal,0,0,0,0,0,10,38,1,11,0 +AbduRa00,2000,tam,15,mia,0,0,0,0,0,4,14,0,0,0 +AbduRa00,2000,tam,1,nwe,0,0,0,0,0,0,0,1,3,0 +AbduRa00,2001,tam,15,nor,0,0,0,0,0,3,6,0,0,0 +AbduRa00,2001,tam,17,phi,0,0,0,0,0,8,34,2,26,0 +AbduRa00,2003,chi,10,det,0,0,0,0,0,2,3,1,7,0 +AbduRa00,2003,chi,11,ram,0,0,0,0,0,1,1,0,0,0 +AbduRa00,2003,chi,13,crd,0,0,0,0,0,1,0,0,0,0 +AbduRa00,2003,chi,14,gnb,0,0,0,0,0,2,3,1,5,0 +AbduRa00,2003,chi,15,min,0,0,0,0,0,1,3,0,0,0 +AbduRa00,2003,chi,17,kan,0,0,0,0,0,2,8,2,19,0 +AbduRa00,2003,chi,2,min,0,0,0,0,0,1,2,2,10,0 +AbduRa00,2003,chi,4,gnb,0,0,0,0,0,1,-4,2,14,0 +AbduRa00,2003,chi,5,rai,0,0,0,0,0,2,8,0,0,0 +AbduRa00,2003,chi,7,sea,0,0,0,0,0,3,4,0,0,0 +AbduRa00,2003,chi,8,det,0,0,0,0,0,1,6,0,0,0 +AbduRa00,2003,chi,9,sdg,0,0,0,0,0,1,3,0,0,0 +AbduRa00,2004,nwe,10,buf,0,0,0,0,0,4,-5,0,0,0 +AbduRa00,2004,nwe,16,nyj,0,0,0,0,0,1,5,0,0,0 +AbduRa00,2004,nwe,17,sfo,0,0,0,0,0,2,5,0,0,0 +AbduRa00,2004,nwe,2,crd,0,0,0,0,0,1,4,0,0,0 +AbduRa00,2004,nwe,5,mia,0,0,0,0,0,5,4,0,0,1 +AbduRa00,2004,nwe,6,sea,0,0,0,0,0,0,0,1,9,0 +AdamCh00,2005,den,10,rai,0,0,0,0,0,2,5,0,0,0 +AdamCh00,2005,den,11,nyj,0,0,0,0,0,1,3,2,21,0 +AdamCh00,2005,den,12,dal,0,0,0,0,0,0,0,1,7,0 +AdamCh00,2005,den,13,kan,0,0,0,0,0,0,0,0,0,0 +AdamCh00,2005,den,14,rav,0,0,0,0,0,0,0,3,35,0 +AdamCh00,2005,den,15,buf,0,0,0,0,0,0,0,0,0,0 +AdamCh00,2005,den,16,rai,0,0,0,0,0,1,-7,0,0,0 +AdamCh00,2005,den,17,sdg,0,0,0,0,0,0,0,2,6,0 +AdamCh00,2005,den,1,mia,0,0,0,0,0,0,0,2,35,0 +AdamCh00,2005,den,2,sdg,0,0,0,0,0,0,0,3,31,0 +AdamCh00,2005,den,3,kan,0,0,0,0,0,0,0,2,23,0 +AdamCh00,2005,den,4,jax,0,0,0,0,0,1,13,1,9,0 +AdamCh00,2005,den,5,was,0,0,0,0,0,0,0,2,11,0 +AdamCh00,2005,den,6,nwe,0,0,0,0,0,0,0,0,0,0 +AdamCh00,2005,den,7,nyg,0,0,0,0,0,0,0,0,0,0 +AdamCh00,2005,den,8,phi,0,0,0,0,0,0,0,3,25,0 +AdamMi00,1997,pit,5,oti,0,0,0,0,0,0,0,1,39,0 +AddaJo00,2006,clt,10,buf,0,0,0,0,0,13,78,7,46,1 +AddaJo00,2006,clt,11,dal,0,0,0,0,0,13,50,1,7,0 +AddaJo00,2006,clt,12,phi,0,0,0,0,0,24,171,2,37,4 +AddaJo00,2006,clt,13,oti,0,0,0,0,0,16,56,1,11,0 +AddaJo00,2006,clt,14,jax,0,0,0,0,0,11,22,1,14,0 +AddaJo00,2006,clt,15,cin,0,0,0,0,0,8,50,2,29,0 +AddaJo00,2006,clt,16,htx,0,0,0,0,0,15,100,4,8,0 +AddaJo00,2006,clt,17,mia,0,0,0,0,0,21,64,3,29,0 +AddaJo00,2006,clt,1,nyg,0,0,0,0,0,7,26,3,22,0 +AddaJo00,2006,clt,2,htx,0,0,0,0,0,16,82,2,22,1 +AddaJo00,2006,clt,3,jax,0,0,0,0,0,3,15,3,13,0 +AddaJo00,2006,clt,4,nyj,0,0,0,0,0,20,84,3,15,1 +AddaJo00,2006,clt,5,oti,0,0,0,0,0,13,62,2,15,0 +AddaJo00,2006,clt,7,was,0,0,0,0,0,11,85,1,20,0 +AddaJo00,2006,clt,8,den,0,0,0,0,0,17,93,5,37,0 +AddaJo00,2006,clt,9,nwe,0,0,0,0,0,18,43,0,0,1 diff --git a/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-containsBadRecords.csv b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-containsBadRecords.csv new file mode 100644 index 000000000..c586f7440 --- /dev/null +++ b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-containsBadRecords.csv @@ -0,0 +1,20 @@ +AbduKa00,Abdul-Jabbar,Karim,rb,1974,1996 +AbduRa00,Abdullah,Rabih,rb,1975,1999 +AberWa00,Abercrombie,Walter,rb,1959,1982 +AbraDa00,Abramowicz,Danny,wr,1945,1967 +AdamBo00,Adams,Bob,te,1946,1969 +AdamCh00,Adams,Charlie,wr,1979,2003 +AdamCu00,Adams,Curtis,rb,1962 +AdamGe00,Adams,George,rb,1962,1985 +AdamGr00,Adams,Grant,2000,2005 +AdamJo00,Adams,John,rb,1937,1959 +Adams,Michael,wr,1974,1997 +AdamMi01,Adamle,Mike,rb,1949,1971 +AdamTo00,Adams,Tony,qb,1950,1975 +AdamTo01,Adams,Tom,wr,1940,1962 +AdamTo02,Adamle,Tony,rb,,1950 +AdamWi00,Adams,Willie,wr,1956,1979 +AddaJo00,Addai,Joseph,1983,2006,rb +AdkiJa00,Adkisson,James,te,1980,2005 +AdkiMa00,Adkins,Margene,wr,1947,1970 +AdkiSa00,Adkins,Sam,qb,1955,1977 diff --git a/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-small.csv b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-small.csv new file mode 100644 index 000000000..48464b030 --- /dev/null +++ b/spring-batch-samples/src/main/resources/data/nonSequentialJob/input/player-small.csv @@ -0,0 +1,20 @@ +AbduKa00,Abdul-Jabbar,Karim,rb,1974,1996 +AbduRa00,Abdullah,Rabih,rb,1975,1999 +AberWa00,Abercrombie,Walter,rb,1959,1982 +AbraDa00,Abramowicz,Danny,wr,1945,1967 +AdamBo00,Adams,Bob,te,1946,1969 +AdamCh00,Adams,Charlie,wr,1979,2003 +AdamCu00,Adams,Curtis,rb,1962,1985 +AdamGe00,Adams,George,rb,1962,1985 +AdamGr00,Adams,Grant,wr,2000,2005 +AdamJo00,Adams,John,rb,1937,1959 +AdamMi00,Adams,Michael,wr,1974,1997 +AdamMi01,Adamle,Mike,rb,1949,1971 +AdamTo00,Adams,Tony,qb,1950,1975 +AdamTo01,Adams,Tom,wr,1940,1962 +AdamTo02,Adamle,Tony,rb,1924,1950 +AdamWi00,Adams,Willie,wr,1956,1979 +AddaJo00,Addai,Joseph,rb,1983,2006 +AdkiJa00,Adkisson,James,te,1980,2005 +AdkiMa00,Adkins,Margene,wr,1947,1970 +AdkiSa00,Adkins,Sam,qb,1955,1977 diff --git a/spring-batch-samples/src/main/resources/jobs/nonSequentialDecisionJob.xml b/spring-batch-samples/src/main/resources/jobs/nonSequentialDecisionJob.xml new file mode 100644 index 000000000..7c4d83843 --- /dev/null +++ b/spring-batch-samples/src/main/resources/jobs/nonSequentialDecisionJob.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + games.file.name=games-small.csv + + player.file.name=player-containsBadRecords.csv + job.commit.interval=2 + + + + + + + diff --git a/spring-batch-samples/src/main/resources/jobs/nonSequentialJob-base.xml b/spring-batch-samples/src/main/resources/jobs/nonSequentialJob-base.xml new file mode 100644 index 000000000..96c82d45d --- /dev/null +++ b/spring-batch-samples/src/main/resources/jobs/nonSequentialJob-base.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELECT games.player_id, games.year_no, SUM(COMPLETES), + SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD), + SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS), + SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD) + from games, players where players.player_id = + games.player_id group by games.player_id, games.year_no + + + + + + + + games.file.name=games-small.csv + + player.file.name=player-containsBadRecords.csv + job.commit.interval=2 + + + + + + + diff --git a/spring-batch-samples/src/main/resources/jobs/nonSequentialJob.xml b/spring-batch-samples/src/main/resources/jobs/nonSequentialJob.xml new file mode 100644 index 000000000..e7c5dd784 --- /dev/null +++ b/spring-batch-samples/src/main/resources/jobs/nonSequentialJob.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + games.file.name=games-small.csv + + player.file.name=player-containsBadRecords.csv + job.commit.interval=2 + + + + + + + diff --git a/spring-batch-samples/src/main/sql/destroy.sql.vpp b/spring-batch-samples/src/main/sql/destroy.sql.vpp index 8e61a5308..bfb6b2b7a 100644 --- a/spring-batch-samples/src/main/sql/destroy.sql.vpp +++ b/spring-batch-samples/src/main/sql/destroy.sql.vpp @@ -8,3 +8,4 @@ DROP TABLE $!{IFEXISTSBEFORE} CUSTOMER $!{IFEXISTS}; DROP TABLE $!{IFEXISTSBEFORE} PLAYERS $!{IFEXISTS}; DROP TABLE $!{IFEXISTSBEFORE} GAMES $!{IFEXISTS}; DROP TABLE $!{IFEXISTSBEFORE} PLAYER_SUMMARY $!{IFEXISTS}; +DROP TABLE $!{IFEXISTSBEFORE} ERROR_LOG $!{IFEXISTS}; diff --git a/spring-batch-samples/src/main/sql/init.sql.vpp b/spring-batch-samples/src/main/sql/init.sql.vpp index 40800cd4b..ad278cf00 100644 --- a/spring-batch-samples/src/main/sql/init.sql.vpp +++ b/spring-batch-samples/src/main/sql/init.sql.vpp @@ -72,4 +72,8 @@ CREATE TABLE PLAYER_SUMMARY ( RECEPTIONS ${BIGINT} NOT NULL , RECEPTIONS_YARDS ${BIGINT} NOT NULL , TOTAL_TD ${BIGINT} NOT NULL -) $!{VOODOO}; \ No newline at end of file +) $!{VOODOO}; + +CREATE TABLE ERROR_LOG ( + MESSAGE CHAR(300) NOT NULL +) $!{VOODOO}; diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialDecisionJobFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialDecisionJobFunctionalTests.java new file mode 100644 index 000000000..925ec2470 --- /dev/null +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialDecisionJobFunctionalTests.java @@ -0,0 +1,37 @@ +package org.springframework.batch.sample; + +import static org.junit.Assert.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.test.AbstractFlowJobTests; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", "/jobs/nonSequentialDecisionJob.xml" }) +public class NonSequentialDecisionJobFunctionalTests extends AbstractFlowJobTests { + + private SimpleJdbcTemplate simpleJdbcTemplate; + + @Test + public void testWithSkips() throws Exception { + simpleJdbcTemplate.update("DELETE from ERROR_LOG"); + simpleJdbcTemplate.update("DELETE from PLAYER_SUMMARY"); + + assertEquals(BatchStatus.COMPLETED, this.launchJob().getStatus()); + + assertEquals(1, simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from ERROR_LOG")); + assertEquals(9, simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from PLAYER_SUMMARY")); + } + + @Autowired + public void setDataSource(DataSource dataSource) { + this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); + } +} diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialJobFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialJobFunctionalTests.java new file mode 100644 index 000000000..2d2ffd649 --- /dev/null +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/NonSequentialJobFunctionalTests.java @@ -0,0 +1,37 @@ +package org.springframework.batch.sample; + +import static org.junit.Assert.assertEquals; + +import javax.sql.DataSource; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.test.AbstractFlowJobTests; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", "/jobs/nonSequentialJob.xml" }) +public class NonSequentialJobFunctionalTests extends AbstractFlowJobTests { + + private SimpleJdbcTemplate simpleJdbcTemplate; + + @Test + public void testWithSkips() throws Exception { + simpleJdbcTemplate.update("DELETE from ERROR_LOG"); + simpleJdbcTemplate.update("DELETE from PLAYER_SUMMARY"); + + assertEquals(BatchStatus.COMPLETED, this.launchJob().getStatus()); + + assertEquals(1, simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from ERROR_LOG")); + assertEquals(9, simpleJdbcTemplate.queryForInt("SELECT COUNT(*) from PLAYER_SUMMARY")); + } + + @Autowired + public void setDataSource(DataSource dataSource) { + this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); + } +}