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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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);
+ }
+}