diff --git a/README.md b/README.md index 6ea42c29c1..831463a254 100644 --- a/README.md +++ b/README.md @@ -54,12 +54,12 @@ In a project directory of your choosing, create the following subdirectory struc ```xml - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -67,7 +67,7 @@ In a project directory of your choosing, create the following subdirectory struc 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -76,27 +76,24 @@ In a project directory of your choosing, create the following subdirectory struc org.hsqldb hsqldb - + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - ``` @@ -128,9 +125,9 @@ Next, you write a SQL script to create a table to store the data. DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) ); ``` @@ -149,19 +146,19 @@ package hello; public class Person { private String lastName; private String firstName; - + public Person() { - + } - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } public String getFirstName() { return firstName; @@ -172,13 +169,14 @@ public class Person { } public void setLastName(String lastName) { - this.lastName = lastName; - } + this.lastName = lastName; + } @Override public String toString() { return "firstName: " + firstName + ", lastName: " + lastName; } + } ``` @@ -196,17 +194,19 @@ package hello; import org.springframework.batch.item.ItemProcessor; public class PersonItemProcessor implements ItemProcessor { + @Override public Person process(final Person person) throws Exception { final String firstName = person.getFirstName().toUpperCase(); final String lastName = person.getLastName().toUpperCase(); - + final Person transformedPerson = new Person(firstName, lastName); System.out.println("Converting (" + person + ") into (" + transformedPerson + ")"); - + return transformedPerson; } + } ``` @@ -258,72 +258,72 @@ import org.springframework.jdbc.core.RowMapper; @EnableAutoConfiguration public class BatchConfiguration { - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } } ``` @@ -333,34 +333,34 @@ Break it down: `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } ``` The first chunk of code defines the input, processor, and output. @@ -372,25 +372,25 @@ The next chunk focuses on the actual job configuration. `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } ``` The first method defines the job and the second one defines a single step. Jobs are built from steps, where each step can involve a reader, a processor, and a writer. @@ -405,23 +405,23 @@ Finally, you run the application. `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } ``` This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. diff --git a/complete/pom.xml b/complete/pom.xml index ee41ee7467..4f99c5e196 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -1,11 +1,11 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -13,7 +13,7 @@ 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -22,38 +22,35 @@ org.hsqldb hsqldb - + - - hello.BatchConfiguration - + + hello.BatchConfiguration + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index 03e27eb1eb..f5e9230719 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -35,76 +35,76 @@ import org.springframework.jdbc.core.RowMapper; @EnableAutoConfiguration public class BatchConfiguration { - // {!begin readerwriterprocessor} - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + // {!begin readerwriterprocessor} + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } - // {!end readerwriterprocessor} + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } + // {!end readerwriterprocessor} - // {!begin jobstep} - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + // {!begin jobstep} + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } - // {!end jobstep} + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } + // {!end jobstep} - // {!begin templatemain} - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + // {!begin templatemain} + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } - // {!end templatemain} + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } + // {!end templatemain} } diff --git a/complete/src/main/java/hello/Person.java b/complete/src/main/java/hello/Person.java index 0cc17ed8a2..745c739150 100644 --- a/complete/src/main/java/hello/Person.java +++ b/complete/src/main/java/hello/Person.java @@ -3,19 +3,19 @@ package hello; public class Person { private String lastName; private String firstName; - + public Person() { - + } - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } public String getFirstName() { return firstName; @@ -26,11 +26,12 @@ public class Person { } public void setLastName(String lastName) { - this.lastName = lastName; - } + this.lastName = lastName; + } @Override public String toString() { return "firstName: " + firstName + ", lastName: " + lastName; } + } diff --git a/complete/src/main/java/hello/PersonItemProcessor.java b/complete/src/main/java/hello/PersonItemProcessor.java index 5256af777f..0752f5868b 100644 --- a/complete/src/main/java/hello/PersonItemProcessor.java +++ b/complete/src/main/java/hello/PersonItemProcessor.java @@ -3,15 +3,17 @@ package hello; import org.springframework.batch.item.ItemProcessor; public class PersonItemProcessor implements ItemProcessor { + @Override public Person process(final Person person) throws Exception { final String firstName = person.getFirstName().toUpperCase(); final String lastName = person.getLastName().toUpperCase(); - + final Person transformedPerson = new Person(firstName, lastName); System.out.println("Converting (" + person + ") into (" + transformedPerson + ")"); - + return transformedPerson; } + } diff --git a/complete/src/main/resources/schema-all.sql b/complete/src/main/resources/schema-all.sql index 4e405e6de6..e472ce1e8c 100644 --- a/complete/src/main/resources/schema-all.sql +++ b/complete/src/main/resources/schema-all.sql @@ -1,7 +1,7 @@ DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) ); diff --git a/initial/pom.xml b/initial/pom.xml index c31944b9ef..f40259867c 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -1,11 +1,11 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -13,7 +13,7 @@ 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -22,25 +22,22 @@ org.hsqldb hsqldb - + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - diff --git a/initial/src/main/resources/schema-all.sql b/initial/src/main/resources/schema-all.sql index 4e405e6de6..e472ce1e8c 100644 --- a/initial/src/main/resources/schema-all.sql +++ b/initial/src/main/resources/schema-all.sql @@ -1,7 +1,7 @@ DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) );