I introduce the job that reading csv file,converting the data,and inserting that to a database.
- TestApplication.java
package org.blog.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } }
- BatchConfig.java
package org.blog.test.batch; import org.blog.test.batch.model.Person; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecutionListener; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private ItemReaderreader; @Autowired private ItemProcessor processor; @Autowired private JobExecutionListener listener; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private JobBuilderFactory jobs; @Autowired private ItemWriter writer; @Bean public Job importUserJob(Step s1) { return jobs.get("importUserJob").incrementer(new RunIdIncrementer()).listener(listener).flow(s1).end().build(); } @Bean public Step step1() { return stepBuilderFactory.get("step1"). chunk(10).reader(reader).processor(processor).writer(writer).build(); } }
- JobCompletionNotificationListener.java
package org.blog.test.batch.component; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.blog.test.batch.model.Person; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.listener.JobExecutionListenerSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; @Component @Slf4j public class JobCompletionNotificationListener extends JobExecutionListenerSupport { private final JdbcTemplate jdbcTemplate; private static final String SELECT_QUERY = "SELECT first_name, last_name FROM people"; @Autowired public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public void afterJob(JobExecution jobExecution) { if (jobExecution.getStatus() == BatchStatus.COMPLETED) { log.info("!!! JOB FINISHED! Time to verify the results"); Listresults = jdbcTemplate.query(SELECT_QUERY, 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) { log.info("Found <{}> in the database.", person); } } } }
- PersonItemProcessor.java
package org.blog.test.batch.component; import lombok.extern.slf4j.Slf4j; import org.blog.test.batch.model.Person; import org.springframework.batch.item.ItemProcessor; import org.springframework.stereotype.Component; @Slf4j @Component 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); log.info("Converting (" + person + ") into (" + transformedPerson + ")"); return transformedPerson; } }
- PersonItemReader.java
package org.blog.test.batch.component; import org.blog.test.batch.model.Person; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; @Component public class PersonItemReader extends FlatFileItemReaderimplements ItemReader { public PersonItemReader() { this.setResource(new ClassPathResource("sample-data.csv")); this.setLineMapper(new DefaultLineMapper () { { setLineTokenizer(new DelimitedLineTokenizer() { { setNames(new String[] { "firstName", "lastName" }); } }); setFieldSetMapper(new BeanWrapperFieldSetMapper () { { setTargetType(Person.class); } }); } }); } }
- PersonItemWriter.java
package org.blog.test.batch.component; import javax.sql.DataSource; import org.blog.test.batch.model.Person; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; import org.springframework.batch.item.database.JdbcBatchItemWriter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class PersonItemWriter extends JdbcBatchItemWriterimplements ItemWriter { @Autowired public PersonItemWriter(DataSource dataSource) { this.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider ()); this.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); this.setDataSource(dataSource); } }
- Person.java
package org.blog.test.batch.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Person { private String lastName; private String firstName; }
- sample-data.csv
Jill,Doe Joe,Doe Justin,Doe Jane,Doe John,Doe
- schema-all.sql
DROP TABLE people IF EXISTS; CREATE TABLE people ( person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, first_name VARCHAR(20), last_name VARCHAR(20) );
- pom.xml
4.0.0 org.blog.test batch-project 0.1.0 org.springframework.boot spring-boot-starter-parent 1.3.2.RELEASE org.springframework.boot spring-boot-starter-batch org.projectlombok lombok 1.16.6 org.hsqldb hsqldb org.springframework.boot spring-boot-maven-plugin
You can find the result that shows batch job is executed.
- Execution Result
2016-02-12 17:00:19.002 INFO 15192 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=importUserJob]] launched with the following parameters: [{run.id=1}] 2016-02-12 17:00:19.017 INFO 15192 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1] 2016-02-12 17:00:19.037 INFO 15192 --- [ main] o.b.t.b.component.PersonItemProcessor : Converting (Person(lastName=Doe, firstName=Jill)) into (Person(lastName=JILL, firstName=DOE)) 2016-02-12 17:00:19.037 INFO 15192 --- [ main] o.b.t.b.component.PersonItemProcessor : Converting (Person(lastName=Doe, firstName=Joe)) into (Person(lastName=JOE, firstName=DOE)) 2016-02-12 17:00:19.037 INFO 15192 --- [ main] o.b.t.b.component.PersonItemProcessor : Converting (Person(lastName=Doe, firstName=Justin)) into (Person(lastName=JUSTIN, firstName=DOE)) 2016-02-12 17:00:19.037 INFO 15192 --- [ main] o.b.t.b.component.PersonItemProcessor : Converting (Person(lastName=Doe, firstName=Jane)) into (Person(lastName=JANE, firstName=DOE)) 2016-02-12 17:00:19.037 INFO 15192 --- [ main] o.b.t.b.component.PersonItemProcessor : Converting (Person(lastName=Doe, firstName=John)) into (Person(lastName=JOHN, firstName=DOE)) 2016-02-12 17:00:19.047 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : !!! JOB FINISHED! Time to verify the results 2016-02-12 17:00:19.052 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : Foundin the database. 2016-02-12 17:00:19.052 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : Found in the database. 2016-02-12 17:00:19.052 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : Found in the database. 2016-02-12 17:00:19.052 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : Found in the database. 2016-02-12 17:00:19.052 INFO 15192 --- [ main] .t.b.c.JobCompletionNotificationListener : Found in the database. 2016-02-12 17:00:19.052 INFO 15192 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [FlowJob: [name=importUserJob]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED]
original source : https://spring.io/guides/gs/batch-processing/
댓글 없음 :
댓글 쓰기