From fa9f024f416e2fb2a681f220d7e3642775931253 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Mon, 14 Jun 2021 17:18:26 +0900 Subject: [PATCH 001/135] spirng batch --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index 38d49b1..cf33793 100644 --- a/pom.xml +++ b/pom.xml @@ -27,11 +27,6 @@ mysql-connector-java runtime - - org.springframework.boot - spring-boot-configuration-processor - true - org.projectlombok lombok From 596202935978405a18d91f762a50c7d788a6db66 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Mon, 14 Jun 2021 17:20:57 +0900 Subject: [PATCH 002/135] spirng batch --- src/main/java/exam/HelloBatchConfiguration.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/exam/HelloBatchConfiguration.java diff --git a/src/main/java/exam/HelloBatchConfiguration.java b/src/main/java/exam/HelloBatchConfiguration.java new file mode 100644 index 0000000..77326ca --- /dev/null +++ b/src/main/java/exam/HelloBatchConfiguration.java @@ -0,0 +1,7 @@ +package exam; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class HelloBatchConfiguration { +} From 76a1c009e40c725566e706912b5f3c5a8d3be9db Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 15 Jun 2021 11:19:50 +0900 Subject: [PATCH 003/135] spirng batch --- pom.xml | 5 +- .../java/exam/HelloBatchConfiguration.java | 7 --- .../HelloJobConfiguration.java | 52 +++++++++++++++++++ .../SpringBatchLectureApplication.java | 2 + src/main/resources/application.properties | 1 - 5 files changed, 56 insertions(+), 11 deletions(-) delete mode 100644 src/main/java/exam/HelloBatchConfiguration.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java diff --git a/pom.xml b/pom.xml index cf33793..725a86d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,10 +21,9 @@ org.springframework.boot spring-boot-starter-batch - - mysql - mysql-connector-java + com.h2database + h2 runtime diff --git a/src/main/java/exam/HelloBatchConfiguration.java b/src/main/java/exam/HelloBatchConfiguration.java deleted file mode 100644 index 77326ca..0000000 --- a/src/main/java/exam/HelloBatchConfiguration.java +++ /dev/null @@ -1,7 +0,0 @@ -package exam; - -import org.springframework.context.annotation.Configuration; - -@Configuration -public class HelloBatchConfiguration { -} diff --git a/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java new file mode 100644 index 0000000..9e65b91 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java @@ -0,0 +1,52 @@ +package io.springbatch.springbatchlecture; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@RequiredArgsConstructor +@Configuration +public class HelloJobConfiguration { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job helloJob() { + return this.jobBuilderFactory.get("helloJob") + .start(step1()) + .next(step2()) + .build(); + } + + @Bean + public Step step1() { + return stepBuilderFactory.get("step1") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println("step1 has executed"); + return RepeatStatus.FINISHED; + } + }) + .build(); + } + @Bean + public Step step2() { + return stepBuilderFactory.get("step2") + .tasklet((contribution, chunkContext) -> { + System.out.println("step2 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java b/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java index 0d8b2d4..8930a69 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java +++ b/src/main/java/io/springbatch/springbatchlecture/SpringBatchLectureApplication.java @@ -1,9 +1,11 @@ package io.springbatch.springbatchlecture; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication +@EnableBatchProcessing public class SpringBatchLectureApplication { public static void main(String[] args) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..e69de29 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +0,0 @@ - From d0a7cb9bf83224472674813f70592dd67671d748 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 15 Jun 2021 11:21:32 +0900 Subject: [PATCH 004/135] spirng batch --- .../io/springbatch/springbatchlecture/HelloJobConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java index 9e65b91..909922c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java @@ -12,7 +12,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - @RequiredArgsConstructor @Configuration public class HelloJobConfiguration { From e11c0a3dde05e98f080aee4f3506888af0f41274 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 16 Jun 2021 17:15:20 +0900 Subject: [PATCH 005/135] spirng batch --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 725a86d..ed01c87 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ spring-batch-lecture Demo project for Spring Boot - 11 + 1.8 From 9af98c3f991cb534d404ed3c5b45686195dd50de Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 14:47:10 +0900 Subject: [PATCH 006/135] spirng batch --- src/main/resources/application.properties | 0 src/main/resources/application.yml | 36 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e3fbc5a --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,36 @@ +spring: + profiles: + active: local + batch: + job: + enabled: false + +--- +spring: + config: + activate: + on-profile: local + datasource: + hikari: + jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + driver-class-name: org.h2.Driver + batch: + jdbc: + initialize-schema: embedded + +--- +spring: + config: + activate: + on-profile: mysql + datasource: + hikari: + jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&characterEncoding=utf8 + username: root + password: pass + driver-class-name: com.mysql.jdbc.Driver + batch: + jdbc: + initialize-schema: always \ No newline at end of file From fe567bd7c22b45db758af88d3d1363fec562f48f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 16:08:10 +0900 Subject: [PATCH 007/135] spirng batch --- ...nfiguration.java => JobConfiguration.java} | 6 +-- .../springbatchlecture/JobConfiguration2.java | 51 +++++++++++++++++++ src/main/resources/application.yml | 1 + 3 files changed, 55 insertions(+), 3 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{HelloJobConfiguration.java => JobConfiguration.java} (93%) create mode 100644 src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java diff --git a/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java similarity index 93% rename from src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java index 909922c..6dfbc5b 100644 --- a/src/main/java/io/springbatch/springbatchlecture/HelloJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java @@ -14,14 +14,14 @@ @RequiredArgsConstructor @Configuration -public class HelloJobConfiguration { +public class JobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean - public Job helloJob() { - return this.jobBuilderFactory.get("helloJob") + public Job batchJob() { + return this.jobBuilderFactory.get("batchJob1") .start(step1()) .next(step2()) .build(); diff --git a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java new file mode 100644 index 0000000..b3c3d03 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java @@ -0,0 +1,51 @@ +package io.springbatch.springbatchlecture; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@RequiredArgsConstructor +@Configuration +public class JobConfiguration2 { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job batchJob2() { + return this.jobBuilderFactory.get("batchJob2") + .start(step3()) + .next(step4()) + .build(); + } + + @Bean + public Step step3() { + return stepBuilderFactory.get("step3") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println("step3 has executed"); + return RepeatStatus.FINISHED; + } + }) + .build(); + } + @Bean + public Step step4() { + return stepBuilderFactory.get("step4") + .tasklet((contribution, chunkContext) -> { + System.out.println("step4 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e3fbc5a..e6de886 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,6 +4,7 @@ spring: batch: job: enabled: false + names: ${job.name:NONE} --- spring: From a5a08837d10ee5de1acc412ff697f32bf8ea68c4 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 16:15:49 +0900 Subject: [PATCH 008/135] spirng batch --- pom.xml | 5 +++++ .../io/springbatch/springbatchlecture/JobConfiguration.java | 2 +- src/main/resources/application.yml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ed01c87..42ddc51 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,11 @@ org.springframework.boot spring-boot-starter-batch + + mysql + mysql-connector-java + runtime + com.h2database h2 diff --git a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java index 6dfbc5b..f4dc964 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java @@ -20,7 +20,7 @@ public class JobConfiguration { private final StepBuilderFactory stepBuilderFactory; @Bean - public Job batchJob() { + public Job batchJob1() { return this.jobBuilderFactory.get("batchJob1") .start(step1()) .next(step2()) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e6de886..4fb13ef 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,7 +3,7 @@ spring: active: local batch: job: - enabled: false +# enabled: false names: ${job.name:NONE} --- From f6bfc6116b844a13492230ea2e2d9617a4e171ca Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 16:39:07 +0900 Subject: [PATCH 009/135] spirng batch --- ...iguration2.java => FlowConfiguration.java} | 22 +++++----- ...tion.java => JobBuilderConfiguration.java} | 6 ++- .../JobBuilderConfiguration2.java | 44 +++++++++++++++++++ 3 files changed, 61 insertions(+), 11 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{JobConfiguration2.java => FlowConfiguration.java} (82%) rename src/main/java/io/springbatch/springbatchlecture/{JobConfiguration.java => JobBuilderConfiguration.java} (88%) create mode 100644 src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java diff --git a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java b/src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java similarity index 82% rename from src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java rename to src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java index b3c3d03..0d61ae5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration2.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java @@ -6,6 +6,8 @@ import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.job.builder.FlowBuilder; +import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; @@ -14,19 +16,10 @@ @RequiredArgsConstructor @Configuration -public class JobConfiguration2 { +public class FlowConfiguration { - private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - @Bean - public Job batchJob2() { - return this.jobBuilderFactory.get("batchJob2") - .start(step3()) - .next(step4()) - .build(); - } - @Bean public Step step3() { return stepBuilderFactory.get("step3") @@ -48,4 +41,13 @@ public Step step4() { }) .build(); } + + @Bean + public Flow flow() { + FlowBuilder flowBuilder = new FlowBuilder<>("flow"); + flowBuilder.start(step3()) + .next(step4()) + .end(); + return flowBuilder.build(); + } } diff --git a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java similarity index 88% rename from src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java index f4dc964..387d1aa 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java @@ -6,6 +6,8 @@ import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.job.flow.Flow; +import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; @@ -14,14 +16,16 @@ @RequiredArgsConstructor @Configuration -public class JobConfiguration { +public class JobBuilderConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final Flow flow; @Bean public Job batchJob1() { return this.jobBuilderFactory.get("batchJob1") + .incrementer(new RunIdIncrementer()) .start(step1()) .next(step2()) .build(); diff --git a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java new file mode 100644 index 0000000..6ce74a1 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java @@ -0,0 +1,44 @@ +package io.springbatch.springbatchlecture; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.job.flow.Flow; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@RequiredArgsConstructor +@Configuration +public class JobBuilderConfiguration2 { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + private final Flow flow; + + @Bean + public Job batchJob2() { + return this.jobBuilderFactory.get("batchJob2") + .incrementer(new RunIdIncrementer()) + .start(flow) + .next(step5()) + .end() + .build(); + } + + @Bean + public Step step5() { + return stepBuilderFactory.get("step5") + .tasklet((contribution, chunkContext) -> { + System.out.println("step5 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } +} From f2611b659b5f9eb6b60a1982626b7e3260a06d43 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 16:48:08 +0900 Subject: [PATCH 010/135] spirng batch --- .../springbatchlecture/JobBuilderConfiguration.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java index 387d1aa..fb9f4e5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java @@ -34,12 +34,9 @@ public Job batchJob1() { @Bean public Step step1() { return stepBuilderFactory.get("step1") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println("step1 has executed"); - return RepeatStatus.FINISHED; - } + .tasklet((contribution, chunkContext) -> { + System.out.println("step1 has executed"); + return RepeatStatus.FINISHED; }) .build(); } From a099693640e212ae524f4a5717b0d8aa4d9decc9 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 16:51:13 +0900 Subject: [PATCH 011/135] spirng batch --- .../springbatchlecture/FlowConfiguration.java | 53 ------------------- .../JobBuilderConfiguration2.java | 44 --------------- ...ation.java => SimpleJobConfiguration.java} | 10 ++-- 3 files changed, 3 insertions(+), 104 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java rename src/main/java/io/springbatch/springbatchlecture/{JobBuilderConfiguration.java => SimpleJobConfiguration.java} (82%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java deleted file mode 100644 index 0d61ae5..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/FlowConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.job.builder.FlowBuilder; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@RequiredArgsConstructor -@Configuration -public class FlowConfiguration { - - private final StepBuilderFactory stepBuilderFactory; - - @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println("step3 has executed"); - return RepeatStatus.FINISHED; - } - }) - .build(); - } - @Bean - public Step step4() { - return stepBuilderFactory.get("step4") - .tasklet((contribution, chunkContext) -> { - System.out.println("step4 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } - - @Bean - public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flow"); - flowBuilder.start(step3()) - .next(step4()) - .end(); - return flowBuilder.build(); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java b/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java deleted file mode 100644 index 6ce74a1..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration2.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@RequiredArgsConstructor -@Configuration -public class JobBuilderConfiguration2 { - - private final JobBuilderFactory jobBuilderFactory; - private final StepBuilderFactory stepBuilderFactory; - private final Flow flow; - - @Bean - public Job batchJob2() { - return this.jobBuilderFactory.get("batchJob2") - .incrementer(new RunIdIncrementer()) - .start(flow) - .next(step5()) - .end() - .build(); - } - - @Bean - public Step step5() { - return stepBuilderFactory.get("step5") - .tasklet((contribution, chunkContext) -> { - System.out.println("step5 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java similarity index 82% rename from src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java index fb9f4e5..668e031 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobBuilderConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java @@ -3,28 +3,24 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @RequiredArgsConstructor @Configuration -public class JobBuilderConfiguration { +public class SimpleJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final Flow flow; @Bean - public Job batchJob1() { - return this.jobBuilderFactory.get("batchJob1") + public Job batchJob() { + return this.jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) .start(step1()) .next(step2()) From 85f4f93c87f8b1f90435336bc83e979583a4be08 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 17:05:43 +0900 Subject: [PATCH 012/135] spirng batch --- .../SimpleJobConfiguration.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java index 668e031..1f16bae 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java @@ -1,6 +1,8 @@ package io.springbatch.springbatchlecture; import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; @@ -24,6 +26,7 @@ public Job batchJob() { .incrementer(new RunIdIncrementer()) .start(step1()) .next(step2()) + .next(step3()) .build(); } @@ -45,4 +48,16 @@ public Step step2() { }) .build(); } + @Bean + public Step step3() { + return stepBuilderFactory.get("step3") + .tasklet((contribution, chunkContext) -> { +// throw new RuntimeException("failed"); + chunkContext.getStepContext().getStepExecution().setStatus(BatchStatus.FAILED); + contribution.setExitStatus(ExitStatus.STOPPED); + System.out.println("step3 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } } From 8894b274706098ffc3230730800d8683edc87d9e Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 17:08:48 +0900 Subject: [PATCH 013/135] spirng batch --- ...eJobConfiguration.java => StartNextConfiguration.java} | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{SimpleJobConfiguration.java => StartNextConfiguration.java} (82%) diff --git a/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java similarity index 82% rename from src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java index 1f16bae..76dabb9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SimpleJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java @@ -1,13 +1,10 @@ package io.springbatch.springbatchlecture; import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; @@ -15,7 +12,7 @@ @RequiredArgsConstructor @Configuration -public class SimpleJobConfiguration { +public class StartNextConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -52,9 +49,6 @@ public Step step2() { public Step step3() { return stepBuilderFactory.get("step3") .tasklet((contribution, chunkContext) -> { -// throw new RuntimeException("failed"); - chunkContext.getStepContext().getStepExecution().setStatus(BatchStatus.FAILED); - contribution.setExitStatus(ExitStatus.STOPPED); System.out.println("step3 has executed"); return RepeatStatus.FINISHED; }) From 631cfa08ec5e4176f234f542a6ab265aaa7ef65a Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 18 Jun 2021 17:32:16 +0900 Subject: [PATCH 014/135] spirng batch --- .../CustomJobParametersIncrementer.java | 20 +++++++++++++++++++ ...ion.java => IncrementerConfiguration.java} | 6 ++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java rename src/main/java/io/springbatch/springbatchlecture/{StartNextConfiguration.java => IncrementerConfiguration.java} (88%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java new file mode 100644 index 0000000..4e2d870 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java @@ -0,0 +1,20 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.JobParametersIncrementer; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class CustomJobParametersIncrementer implements JobParametersIncrementer { + + static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss"); + + public JobParameters getNext(JobParameters parameters) { + String id = format.format(new Date()); + return new JobParametersBuilder().addString("run.id", id).toJobParameters(); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java similarity index 88% rename from src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java index 76dabb9..5228640 100644 --- a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java @@ -12,15 +12,17 @@ @RequiredArgsConstructor @Configuration -public class StartNextConfiguration { +public class IncrementerConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final CustomJobParametersIncrementer customJobParametersIncrementer; @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") - .incrementer(new RunIdIncrementer()) +// .incrementer(new RunIdIncrementer()) + .incrementer(customJobParametersIncrementer) .start(step1()) .next(step2()) .next(step3()) From 73c8187f36dcb0c7927fded26ec5b7e75a01f720 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 16:30:56 +0900 Subject: [PATCH 015/135] spring batch --- .../CustomJobParametersIncrementer.java | 20 ------------------- .../CustomJobParametersValidator.java | 17 ++++++++++++++++ ...ation.java => ValidatorConfiguration.java} | 9 ++++----- 3 files changed, 21 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java rename src/main/java/io/springbatch/springbatchlecture/{IncrementerConfiguration.java => ValidatorConfiguration.java} (85%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java deleted file mode 100644 index 4e2d870..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersIncrementer.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.JobParametersBuilder; -import org.springframework.batch.core.JobParametersIncrementer; -import org.springframework.stereotype.Component; - -import java.text.SimpleDateFormat; -import java.util.Date; - -@Component -public class CustomJobParametersIncrementer implements JobParametersIncrementer { - - static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss"); - - public JobParameters getNext(JobParameters parameters) { - String id = format.format(new Date()); - return new JobParametersBuilder().addString("run.id", id).toJobParameters(); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java new file mode 100644 index 0000000..a09c2c5 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java @@ -0,0 +1,17 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.core.*; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class CustomJobParametersValidator implements JobParametersValidator { + + @Override + public void validate(JobParameters jobParameters) throws JobParametersInvalidException { + if (jobParameters.getString("name") == null) { + throw new JobParametersInvalidException("name parameter is not found."); + } + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java similarity index 85% rename from src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java index 5228640..571b631 100644 --- a/src/main/java/io/springbatch/springbatchlecture/IncrementerConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java @@ -5,24 +5,23 @@ import org.springframework.batch.core.Step; 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.core.job.DefaultJobParametersValidator; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @RequiredArgsConstructor @Configuration -public class IncrementerConfiguration { +public class ValidatorConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final CustomJobParametersIncrementer customJobParametersIncrementer; @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") -// .incrementer(new RunIdIncrementer()) - .incrementer(customJobParametersIncrementer) +// .validator(new CustomJobParametersValidator()) + .validator(new DefaultJobParametersValidator(new String[]{"name"},new String[]{"year"})) .start(step1()) .next(step2()) .next(step3()) From e3909e2de45eca13b83bb56d40f25199739ecd39 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 16:43:30 +0900 Subject: [PATCH 016/135] spring batch --- .../CustomJobParametersValidator.java | 17 ----------------- ...on.java => PreventRestartConfiguration.java} | 8 ++++---- 2 files changed, 4 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java rename src/main/java/io/springbatch/springbatchlecture/{ValidatorConfiguration.java => PreventRestartConfiguration.java} (87%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java b/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java deleted file mode 100644 index a09c2c5..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomJobParametersValidator.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.core.*; -import org.springframework.stereotype.Component; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class CustomJobParametersValidator implements JobParametersValidator { - - @Override - public void validate(JobParameters jobParameters) throws JobParametersInvalidException { - if (jobParameters.getString("name") == null) { - throw new JobParametersInvalidException("name parameter is not found."); - } - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java similarity index 87% rename from src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java index 571b631..b92b5b0 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ValidatorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java @@ -12,7 +12,7 @@ @RequiredArgsConstructor @Configuration -public class ValidatorConfiguration { +public class PreventRestartConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -20,11 +20,10 @@ public class ValidatorConfiguration { @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") -// .validator(new CustomJobParametersValidator()) - .validator(new DefaultJobParametersValidator(new String[]{"name"},new String[]{"year"})) .start(step1()) .next(step2()) .next(step3()) +// .preventRestart() .build(); } @@ -51,7 +50,8 @@ public Step step3() { return stepBuilderFactory.get("step3") .tasklet((contribution, chunkContext) -> { System.out.println("step3 has executed"); - return RepeatStatus.FINISHED; + throw new RuntimeException("step has failed"); +// return RepeatStatus.FINISHED; }) .build(); } From 203595c218371b3ac53ad48cb086a4576cd1b7d1 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 16:45:34 +0900 Subject: [PATCH 017/135] spring batch --- .../springbatchlecture/PreventRestartConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java index b92b5b0..3e2336c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java @@ -23,7 +23,7 @@ public Job batchJob() { .start(step1()) .next(step2()) .next(step3()) -// .preventRestart() + .preventRestart() .build(); } From 833e6daefd2b82f076539c134a435ede7f335acd Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 17:32:21 +0900 Subject: [PATCH 018/135] spring batch --- ...ion.java => StepBuilderConfiguration.java} | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{PreventRestartConfiguration.java => StepBuilderConfiguration.java} (56%) diff --git a/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java similarity index 56% rename from src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java index 3e2336c..ea0783a 100644 --- a/src/main/java/io/springbatch/springbatchlecture/PreventRestartConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java @@ -6,13 +6,19 @@ import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.DefaultJobParametersValidator; +import org.springframework.batch.core.job.builder.FlowBuilder; +import org.springframework.batch.core.job.flow.Flow; +import org.springframework.batch.core.partition.support.Partitioner; +import org.springframework.batch.item.*; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.Map; + @RequiredArgsConstructor @Configuration -public class PreventRestartConfiguration { +public class StepBuilderConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -23,7 +29,6 @@ public Job batchJob() { .start(step1()) .next(step2()) .next(step3()) - .preventRestart() .build(); } @@ -39,20 +44,45 @@ public Step step1() { @Bean public Step step2() { return stepBuilderFactory.get("step2") - .tasklet((contribution, chunkContext) -> { - System.out.println("step2 has executed"); - return RepeatStatus.FINISHED; - }) + .chunk(3) + .reader(() -> null) + .writer(list -> {}) .build(); } @Bean public Step step3() { return stepBuilderFactory.get("step3") - .tasklet((contribution, chunkContext) -> { - System.out.println("step3 has executed"); - throw new RuntimeException("step has failed"); -// return RepeatStatus.FINISHED; - }) + .partitioner(step1()) + .build(); + } + + @Bean + public Step step4() { + return stepBuilderFactory.get("step4") + .job(job()) + .build(); + } + + @Bean + public Step step5() { + return stepBuilderFactory.get("step5") + .flow(flow()) + .build(); + } + + @Bean + public Job job() { + return this.jobBuilderFactory.get("job") + .start(step1()) + .next(step2()) + .next(step3()) .build(); } + + @Bean + public Flow flow() { + FlowBuilder flowBuilder = new FlowBuilder<>("flow"); + flowBuilder.start(step2()).end(); + return flowBuilder.build(); + } } From 2c6d0c25e454428eb0ffe92c34085de3c63bcf3b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 17:58:21 +0900 Subject: [PATCH 019/135] spring batch --- ...ion.java => TaskletStepConfiguration.java} | 59 +++++-------------- 1 file changed, 14 insertions(+), 45 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{StepBuilderConfiguration.java => TaskletStepConfiguration.java} (54%) diff --git a/src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java similarity index 54% rename from src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java index ea0783a..8ac6fd9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/StepBuilderConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java @@ -10,15 +10,18 @@ import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.partition.support.Partitioner; import org.springframework.batch.item.*; +import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.Arrays; import java.util.Map; +import java.util.stream.Collectors; @RequiredArgsConstructor @Configuration -public class StepBuilderConfiguration { +public class TaskletStepConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -26,15 +29,14 @@ public class StepBuilderConfiguration { @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") - .start(step1()) - .next(step2()) - .next(step3()) + .start(taskStep()) + .next(chunkStep()) .build(); } @Bean - public Step step1() { - return stepBuilderFactory.get("step1") + public Step taskStep() { + return stepBuilderFactory.get("taskStep") .tasklet((contribution, chunkContext) -> { System.out.println("step1 has executed"); return RepeatStatus.FINISHED; @@ -42,47 +44,14 @@ public Step step1() { .build(); } @Bean - public Step step2() { - return stepBuilderFactory.get("step2") + public Step chunkStep() { + return stepBuilderFactory.get("chunkStep") .chunk(3) - .reader(() -> null) - .writer(list -> {}) - .build(); - } - @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .partitioner(step1()) - .build(); - } - - @Bean - public Step step4() { - return stepBuilderFactory.get("step4") - .job(job()) - .build(); - } - - @Bean - public Step step5() { - return stepBuilderFactory.get("step5") - .flow(flow()) - .build(); - } - - @Bean - public Job job() { - return this.jobBuilderFactory.get("job") - .start(step1()) - .next(step2()) - .next(step3()) + .reader(new ListItemReader(Arrays.asList("item1","item2","item3"))) + .writer(list -> { + list.forEach(item -> System.out.println(item)); + }) .build(); } - @Bean - public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flow"); - flowBuilder.start(step2()).end(); - return flowBuilder.build(); - } } From 43ea94f9d2e13096f83190904196889c63599f7f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 18:45:20 +0900 Subject: [PATCH 020/135] spring batch --- .../springbatch/springbatchlecture/TaskletStepConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java index 8ac6fd9..2336397 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java @@ -42,6 +42,7 @@ public Step taskStep() { return RepeatStatus.FINISHED; }) .build(); + } @Bean public Step chunkStep() { From 225a91b35120581d435f92e11992e7ee36d12850 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 18:45:41 +0900 Subject: [PATCH 021/135] spring batch --- .../springbatch/springbatchlecture/TaskletStepConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java index 2336397..8ac6fd9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java @@ -42,7 +42,6 @@ public Step taskStep() { return RepeatStatus.FINISHED; }) .build(); - } @Bean public Step chunkStep() { From f79b2be203ed9b07bb88b138176433375259ce6d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 19:23:54 +0900 Subject: [PATCH 022/135] spring batch --- .../springbatchlecture/CustomTasklet.java | 19 +++++++++++ ...uration.java => TaskletConfiguration.java} | 34 ++++++++++--------- 2 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java rename src/main/java/io/springbatch/springbatchlecture/{TaskletStepConfiguration.java => TaskletConfiguration.java} (59%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java b/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java new file mode 100644 index 0000000..5774623 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java @@ -0,0 +1,19 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.stereotype.Component; + +@Component +public class CustomTasklet implements Tasklet { + + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + + System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); + + return RepeatStatus.FINISHED; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java similarity index 59% rename from src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java index 8ac6fd9..29aebc0 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TaskletStepConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java @@ -3,12 +3,15 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; +import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.DefaultJobParametersValidator; import org.springframework.batch.core.job.builder.FlowBuilder; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.partition.support.Partitioner; +import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.*; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; @@ -21,37 +24,36 @@ @RequiredArgsConstructor @Configuration -public class TaskletStepConfiguration { +public class TaskletConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final CustomTasklet customTasklet; @Bean public Job batchJob() { return this.jobBuilderFactory.get("batchJob") - .start(taskStep()) - .next(chunkStep()) + .start(step1()) + .next(step2()) .build(); } @Bean - public Step taskStep() { - return stepBuilderFactory.get("taskStep") - .tasklet((contribution, chunkContext) -> { - System.out.println("step1 has executed"); - return RepeatStatus.FINISHED; + public Step step1() { + return stepBuilderFactory.get("step1") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); + return RepeatStatus.FINISHED; + } }) .build(); } @Bean - public Step chunkStep() { - return stepBuilderFactory.get("chunkStep") - .chunk(3) - .reader(new ListItemReader(Arrays.asList("item1","item2","item3"))) - .writer(list -> { - list.forEach(item -> System.out.println(item)); - }) + public Step step2() { + return stepBuilderFactory.get("step2") + .tasklet(customTasklet) .build(); } - } From c90f2df41117c13903dcae647103a717ba1ab056 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 19:32:15 +0900 Subject: [PATCH 023/135] spring batch --- .../springbatchlecture/CustomTasklet.java | 19 ------------------- ...uration.java => JobStepConfiguration.java} | 11 ++++++++--- 2 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java rename src/main/java/io/springbatch/springbatchlecture/{TaskletConfiguration.java => JobStepConfiguration.java} (82%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java b/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java deleted file mode 100644 index 5774623..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomTasklet.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.core.StepContribution; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.stereotype.Component; - -@Component -public class CustomTasklet implements Tasklet { - - @Override - public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { - - System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); - - return RepeatStatus.FINISHED; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java similarity index 82% rename from src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java index 29aebc0..11054f5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TaskletConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java @@ -24,11 +24,10 @@ @RequiredArgsConstructor @Configuration -public class TaskletConfiguration { +public class JobStepConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final CustomTasklet customTasklet; @Bean public Job batchJob() { @@ -53,7 +52,13 @@ public RepeatStatus execute(StepContribution stepContribution, ChunkContext chun @Bean public Step step2() { return stepBuilderFactory.get("step2") - .tasklet(customTasklet) + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { + System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); + return RepeatStatus.FINISHED; + } + }) .build(); } } From 49a83c616f9ac7c477e4ee8cc6e6785a81f2f068 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 19:59:38 +0900 Subject: [PATCH 024/135] spring batch --- .../JobStepConfiguration.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java index 11054f5..3025471 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java @@ -9,8 +9,10 @@ import org.springframework.batch.core.job.DefaultJobParametersValidator; import org.springframework.batch.core.job.builder.FlowBuilder; import org.springframework.batch.core.job.flow.Flow; +import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.partition.support.Partitioner; import org.springframework.batch.core.scope.context.ChunkContext; +import org.springframework.batch.core.step.job.DefaultJobParametersExtractor; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.*; import org.springframework.batch.item.support.ListItemReader; @@ -30,35 +32,43 @@ public class JobStepConfiguration { private final StepBuilderFactory stepBuilderFactory; @Bean - public Job batchJob() { - return this.jobBuilderFactory.get("batchJob") - .start(step1()) + public Job parentJob() { + return this.jobBuilderFactory.get("parentJob") + .start(jobStep(null)) .next(step2()) .build(); } - + @Bean + public Step jobStep(JobLauncher jobLauncher) { + return this.stepBuilderFactory.get("jobStep") + .job(childJob()) + .launcher(jobLauncher) + .parametersExtractor(jobParametersExtractor()) + .build(); + } + @Bean + public Job childJob() { + return this.jobBuilderFactory.get("childJob") + .start(step1()) + .build(); + } @Bean public Step step1() { return stepBuilderFactory.get("step1") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { - System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); - return RepeatStatus.FINISHED; - } - }) + .tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED) .build(); } @Bean public Step step2() { return stepBuilderFactory.get("step2") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { - System.out.println("stepContribution = " + stepContribution + ", chunkContext = " + chunkContext); - return RepeatStatus.FINISHED; - } - }) + .tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED) .build(); } + + @Bean + public DefaultJobParametersExtractor jobParametersExtractor() { + DefaultJobParametersExtractor extractor = new DefaultJobParametersExtractor(); + extractor.setKeys(new String[]{"input.file"}); + return extractor; + } } From 6c23a935b6225f446088b8831fc7c4df5a99c8ac Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 19 Jun 2021 20:01:16 +0900 Subject: [PATCH 025/135] spring batch --- .../{JobStepConfiguration.java => FlowJobConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JobStepConfiguration.java => FlowJobConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java index 3025471..2d44aa6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobStepConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class JobStepConfiguration { +public class FlowJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From c75c245e29188b092a4c7749248f7ccd0bca50da Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 00:05:30 +0900 Subject: [PATCH 026/135] spring batch --- .../FlowJobConfiguration.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java index 2d44aa6..51260e3 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java @@ -32,43 +32,47 @@ public class FlowJobConfiguration { private final StepBuilderFactory stepBuilderFactory; @Bean - public Job parentJob() { - return this.jobBuilderFactory.get("parentJob") - .start(jobStep(null)) - .next(step2()) - .build(); - } - @Bean - public Step jobStep(JobLauncher jobLauncher) { - return this.stepBuilderFactory.get("jobStep") - .job(childJob()) - .launcher(jobLauncher) - .parametersExtractor(jobParametersExtractor()) - .build(); - } - @Bean - public Job childJob() { - return this.jobBuilderFactory.get("childJob") + public Job batchJob() { + return jobBuilderFactory.get("batchJob") .start(step1()) + .on("COMPLETED").to(step2()) + .next(step3()) + .end() .build(); } + @Bean public Step step1() { return stepBuilderFactory.get("step1") - .tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED) - .build(); + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println("step1 has executed"); + return RepeatStatus.FINISHED; + } + }).build(); } + @Bean public Step step2() { return stepBuilderFactory.get("step2") - .tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED) - .build(); + .tasklet((contribution, chunkContext) -> { + System.out.println("step2 has executed"); + return RepeatStatus.FINISHED; + }).build(); } @Bean - public DefaultJobParametersExtractor jobParametersExtractor() { - DefaultJobParametersExtractor extractor = new DefaultJobParametersExtractor(); - extractor.setKeys(new String[]{"input.file"}); - return extractor; + public Step step3() { + return stepBuilderFactory.get("step3") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println("step3 has executed"); + return RepeatStatus.FINISHED; + } + }).build(); } + + } From 21910d326f2d7c9eb32ae81b2618dc49272021bc Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 00:14:12 +0900 Subject: [PATCH 027/135] spring batch --- ...guration.java => StartNextConfiguration.java} | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{FlowJobConfiguration.java => StartNextConfiguration.java} (90%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java similarity index 90% rename from src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java index 51260e3..b4d7acc 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class FlowJobConfiguration { +public class StartNextConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -34,13 +34,22 @@ public class FlowJobConfiguration { @Bean public Job batchJob() { return jobBuilderFactory.get("batchJob") - .start(step1()) - .on("COMPLETED").to(step2()) + .start(flow()) .next(step3()) .end() .build(); } + @Bean + public Flow flow() { + FlowBuilder flowBuilder = new FlowBuilder<>("flow"); + flowBuilder.start(step1()) + .next(step2()) + .end(); + + return flowBuilder.build(); + } + @Bean public Step step1() { return stepBuilderFactory.get("step1") @@ -74,5 +83,4 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon }).build(); } - } From c2c4b0254558e5dff7463b50384f39e0b09e836d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 00:22:05 +0900 Subject: [PATCH 028/135] spring batch --- .../StartNextConfiguration.java | 60 +++++++++++++++++-- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java index b4d7acc..b5ad720 100644 --- a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java @@ -34,15 +34,17 @@ public class StartNextConfiguration { @Bean public Job batchJob() { return jobBuilderFactory.get("batchJob") - .start(flow()) + .start(flowA()) .next(step3()) + .next(flowB()) + .next(step6()) .end() .build(); } @Bean - public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flow"); + public Flow flowA() { + FlowBuilder flowBuilder = new FlowBuilder<>("flowA"); flowBuilder.start(step1()) .next(step2()) .end(); @@ -50,13 +52,23 @@ public Flow flow() { return flowBuilder.build(); } + @Bean + public Flow flowB() { + FlowBuilder flowBuilder = new FlowBuilder<>("flowB"); + flowBuilder.start(step4()) + .next(step5()) + .end(); + + return flowBuilder.build(); + } + @Bean public Step step1() { return stepBuilderFactory.get("step1") .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println("step1 has executed"); + System.out.println(">> step1 has executed"); return RepeatStatus.FINISHED; } }).build(); @@ -66,7 +78,7 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon public Step step2() { return stepBuilderFactory.get("step2") .tasklet((contribution, chunkContext) -> { - System.out.println("step2 has executed"); + System.out.println(">> step2 has executed"); return RepeatStatus.FINISHED; }).build(); } @@ -77,7 +89,43 @@ public Step step3() { .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println("step3 has executed"); + System.out.println(">> step3 has executed"); + return RepeatStatus.FINISHED; + } + }).build(); + } + + @Bean + public Step step4() { + return stepBuilderFactory.get("step4") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println(">> step4 has executed"); + return RepeatStatus.FINISHED; + } + }).build(); + } + + @Bean + public Step step5() { + return stepBuilderFactory.get("step5") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println(">> step5 has executed"); + return RepeatStatus.FINISHED; + } + }).build(); + } + + @Bean + public Step step6() { + return stepBuilderFactory.get("step6") + .tasklet(new Tasklet() { + @Override + public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { + System.out.println(">> step6 has executed"); return RepeatStatus.FINISHED; } }).build(); From 1d7822c2e429814bdc9e53440900e3e80b59447f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 00:44:21 +0900 Subject: [PATCH 029/135] spring batch --- ...tion.java => TransitionConfiguration.java} | 54 ++----------------- 1 file changed, 3 insertions(+), 51 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{StartNextConfiguration.java => TransitionConfiguration.java} (62%) diff --git a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java similarity index 62% rename from src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java index b5ad720..a431814 100644 --- a/src/main/java/io/springbatch/springbatchlecture/StartNextConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class StartNextConfiguration { +public class TransitionConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -34,16 +34,14 @@ public class StartNextConfiguration { @Bean public Job batchJob() { return jobBuilderFactory.get("batchJob") - .start(flowA()) + .start(flow()) .next(step3()) - .next(flowB()) - .next(step6()) .end() .build(); } @Bean - public Flow flowA() { + public Flow flow() { FlowBuilder flowBuilder = new FlowBuilder<>("flowA"); flowBuilder.start(step1()) .next(step2()) @@ -52,16 +50,6 @@ public Flow flowA() { return flowBuilder.build(); } - @Bean - public Flow flowB() { - FlowBuilder flowBuilder = new FlowBuilder<>("flowB"); - flowBuilder.start(step4()) - .next(step5()) - .end(); - - return flowBuilder.build(); - } - @Bean public Step step1() { return stepBuilderFactory.get("step1") @@ -95,40 +83,4 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon }).build(); } - @Bean - public Step step4() { - return stepBuilderFactory.get("step4") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println(">> step4 has executed"); - return RepeatStatus.FINISHED; - } - }).build(); - } - - @Bean - public Step step5() { - return stepBuilderFactory.get("step5") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println(">> step5 has executed"); - return RepeatStatus.FINISHED; - } - }).build(); - } - - @Bean - public Step step6() { - return stepBuilderFactory.get("step6") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println(">> step6 has executed"); - return RepeatStatus.FINISHED; - } - }).build(); - } - } From d4b64dcff175c45c8fc875a7f55d6f2522ad3be2 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 00:59:33 +0900 Subject: [PATCH 030/135] spring batch --- .../TransitionConfiguration.java | 88 +++++++++++++------ 1 file changed, 59 insertions(+), 29 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java index a431814..f0f42f2 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java @@ -1,15 +1,15 @@ package io.springbatch.springbatchlecture; import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.job.DefaultJobParametersValidator; import org.springframework.batch.core.job.builder.FlowBuilder; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.listener.StepExecutionListenerSupport; import org.springframework.batch.core.partition.support.Partitioner; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.job.DefaultJobParametersExtractor; @@ -33,54 +33,84 @@ public class TransitionConfiguration { @Bean public Job batchJob() { - return jobBuilderFactory.get("batchJob") - .start(flow()) - .next(step3()) + return this.jobBuilderFactory.get("batchJob") + .start(step1()) + .on("FAILED") + .to(step2()) + .on("*") + .stop() + .from(step1()).on("*") + .to(step5()) + .next(step6()) + .on("COMPLETED") + .end() .end() .build(); } @Bean public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flowA"); - flowBuilder.start(step1()) - .next(step2()) + FlowBuilder flowBuilder = new FlowBuilder<>("flow"); + flowBuilder + .start(step3()) + .next(step4()) .end(); - return flowBuilder.build(); } @Bean public Step step1() { return stepBuilderFactory.get("step1") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println(">> step1 has executed"); - return RepeatStatus.FINISHED; - } - }).build(); + .tasklet((contribution, chunkContext) -> { + System.out.println(">> step1 has executed"); +// contribution.setExitStatus(ExitStatus.FAILED); + return RepeatStatus.FINISHED; + }) + .build(); } - @Bean public Step step2() { return stepBuilderFactory.get("step2") + .flow(flow()) + .build(); + } + @Bean + public Step step3() { + return stepBuilderFactory.get("step3") .tasklet((contribution, chunkContext) -> { - System.out.println(">> step2 has executed"); + System.out.println(">> step3 has executed"); return RepeatStatus.FINISHED; - }).build(); + }) + .build(); } @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .tasklet(new Tasklet() { - @Override - public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - System.out.println(">> step3 has executed"); - return RepeatStatus.FINISHED; - } - }).build(); + public Step step4() { + return stepBuilderFactory.get("step4") + .tasklet((contribution, chunkContext) -> { + System.out.println(">> step4 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } + + @Bean + public Step step5() { + return stepBuilderFactory.get("step5") + .tasklet((contribution, chunkContext) -> { + System.out.println(">> step5 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); } + @Bean + public Step step6() { + return stepBuilderFactory.get("step6") + .tasklet((contribution, chunkContext) -> { + System.out.println(">> step6 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } } From a05efec826d71d17fe9e397664f6a950e90ac12d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 01:10:39 +0900 Subject: [PATCH 031/135] spring batch --- .../TransitionConfiguration.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java index f0f42f2..5b2e083 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java @@ -42,8 +42,10 @@ public Job batchJob() { .from(step1()).on("*") .to(step5()) .next(step6()) - .on("COMPLETED") + .on("DO PASS") .end() + .from(step6()).on("*") + .to(step7()) .end() .build(); } @@ -111,6 +113,30 @@ public Step step6() { System.out.println(">> step6 has executed"); return RepeatStatus.FINISHED; }) + .listener(new PassCheckingListener()) .build(); } + + @Bean + public Step step7() { + return stepBuilderFactory.get("step7") + .tasklet((contribution, chunkContext) -> { + System.out.println(">> step7 has executed"); + return RepeatStatus.FINISHED; + }) + .build(); + } + + static class PassCheckingListener extends StepExecutionListenerSupport { + + public ExitStatus afterStep(StepExecution stepExecution) { + + String exitCode = stepExecution.getExitStatus().getExitCode(); + if (!exitCode.equals(ExitStatus.FAILED.getExitCode())) { + return new ExitStatus("DO PASS "); + } else { + return null; + } + } + } } From 441095be602d79c8999c473ae3892b6af95afd16 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 01:14:51 +0900 Subject: [PATCH 032/135] spring batch --- .../TransitionConfiguration.java | 69 +++---------------- 1 file changed, 9 insertions(+), 60 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java index 5b2e083..d13c380 100644 --- a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java @@ -37,35 +37,20 @@ public Job batchJob() { .start(step1()) .on("FAILED") .to(step2()) - .on("*") - .stop() - .from(step1()).on("*") - .to(step5()) - .next(step6()) .on("DO PASS") - .end() - .from(step6()).on("*") - .to(step7()) + .stop() + .from(step2()).on("*") + .to(step3()) .end() .build(); } - @Bean - public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flow"); - flowBuilder - .start(step3()) - .next(step4()) - .end(); - return flowBuilder.build(); - } - @Bean public Step step1() { return stepBuilderFactory.get("step1") .tasklet((contribution, chunkContext) -> { System.out.println(">> step1 has executed"); -// contribution.setExitStatus(ExitStatus.FAILED); + contribution.setExitStatus(ExitStatus.FAILED); return RepeatStatus.FINISHED; }) .build(); @@ -73,60 +58,24 @@ public Step step1() { @Bean public Step step2() { return stepBuilderFactory.get("step2") - .flow(flow()) - .build(); - } - @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step3 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } - - @Bean - public Step step4() { - return stepBuilderFactory.get("step4") .tasklet((contribution, chunkContext) -> { - System.out.println(">> step4 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } - - @Bean - public Step step5() { - return stepBuilderFactory.get("step5") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step5 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } - - @Bean - public Step step6() { - return stepBuilderFactory.get("step6") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step6 has executed"); + System.out.println(">> step2 has executed"); return RepeatStatus.FINISHED; }) .listener(new PassCheckingListener()) .build(); } - @Bean - public Step step7() { - return stepBuilderFactory.get("step7") + public Step step3() { + return stepBuilderFactory.get("step3") .tasklet((contribution, chunkContext) -> { - System.out.println(">> step7 has executed"); + System.out.println(">> step3 has executed"); return RepeatStatus.FINISHED; }) .build(); } + static class PassCheckingListener extends StepExecutionListenerSupport { public ExitStatus afterStep(StepExecution stepExecution) { From 3d1c5ca4a4051d225b38154b5102e5cb25022f16 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 13:00:55 +0900 Subject: [PATCH 033/135] spring batch --- .../JobExecutionDeciderConfiguration.java | 79 ++++++++++++++++ .../TransitionConfiguration.java | 91 ------------------- 2 files changed, 79 insertions(+), 91 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java diff --git a/src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java new file mode 100644 index 0000000..64b8ec5 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java @@ -0,0 +1,79 @@ +package io.springbatch.springbatchlecture; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.*; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.job.flow.FlowExecutionStatus; +import org.springframework.batch.core.job.flow.JobExecutionDecider; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@RequiredArgsConstructor +@Configuration +public class JobExecutionDeciderConfiguration { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job job() { + return jobBuilderFactory.get("job") + .start(startStep()) + .next(decider()) + .from(decider()).on("ODD").to(oddStep()) + .from(decider()).on("EVEN").to(evenStep()) + .from(oddStep()).on("*").to(decider()) + .end() + .build(); + } + @Bean + public Step startStep() { + return stepBuilderFactory.get("startStep") + .tasklet((contribution, chunkContext) -> { + System.out.println("This is the start tasklet"); + return RepeatStatus.FINISHED; + }).build(); + } + + @Bean + public Step evenStep() { + return stepBuilderFactory.get("evenStep") + .tasklet((contribution, chunkContext) -> { + System.out.println(">>EvenStep has executed"); + return RepeatStatus.FINISHED; + }).build(); + } + + @Bean + public Step oddStep() { + return stepBuilderFactory.get("oddStep") + .tasklet((contribution, chunkContext) -> { + System.out.println(">>OddStep has executed"); + return RepeatStatus.FINISHED; + }).build(); + } + + @Bean + public JobExecutionDecider decider() { + return new CustomDecider(); + } + + public static class CustomDecider implements JobExecutionDecider { + + private int count = 0; + + @Override + public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) { + count++; + + if(count % 2 == 0) { + return new FlowExecutionStatus("EVEN"); + } + else { + return new FlowExecutionStatus("ODD"); + } + } + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java deleted file mode 100644 index d13c380..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/TransitionConfiguration.java +++ /dev/null @@ -1,91 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.*; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.job.DefaultJobParametersValidator; -import org.springframework.batch.core.job.builder.FlowBuilder; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.launch.JobLauncher; -import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.core.listener.StepExecutionListenerSupport; -import org.springframework.batch.core.partition.support.Partitioner; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.job.DefaultJobParametersExtractor; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.item.*; -import org.springframework.batch.item.support.ListItemReader; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -@Configuration -public class TransitionConfiguration { - - private final JobBuilderFactory jobBuilderFactory; - private final StepBuilderFactory stepBuilderFactory; - - @Bean - public Job batchJob() { - return this.jobBuilderFactory.get("batchJob") - .start(step1()) - .on("FAILED") - .to(step2()) - .on("DO PASS") - .stop() - .from(step2()).on("*") - .to(step3()) - .end() - .build(); - } - - @Bean - public Step step1() { - return stepBuilderFactory.get("step1") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step1 has executed"); - contribution.setExitStatus(ExitStatus.FAILED); - return RepeatStatus.FINISHED; - }) - .build(); - } - @Bean - public Step step2() { - return stepBuilderFactory.get("step2") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step2 has executed"); - return RepeatStatus.FINISHED; - }) - .listener(new PassCheckingListener()) - .build(); - } - @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step3 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); - } - - - static class PassCheckingListener extends StepExecutionListenerSupport { - - public ExitStatus afterStep(StepExecution stepExecution) { - - String exitCode = stepExecution.getExitStatus().getExitCode(); - if (!exitCode.equals(ExitStatus.FAILED.getExitCode())) { - return new ExitStatus("DO PASS "); - } else { - return null; - } - } - } -} From 688c13768fb3e6bc165c3e6595b54e20c58bbadc Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 13:27:51 +0900 Subject: [PATCH 034/135] spring batch --- ...utionDeciderConfiguration.java => FlowJobConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JobExecutionDeciderConfiguration.java => FlowJobConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java index 64b8ec5..db65df0 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobExecutionDeciderConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java @@ -12,7 +12,7 @@ @RequiredArgsConstructor @Configuration -public class JobExecutionDeciderConfiguration { +public class FlowJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From f32486348aca8494441d488934c6895eca2adfbc Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 13:31:46 +0900 Subject: [PATCH 035/135] spring batch --- .../FlowJobConfiguration.java | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java index db65df0..a4dd1ea 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java @@ -4,6 +4,8 @@ import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.job.builder.FlowBuilder; +import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.JobExecutionDecider; import org.springframework.batch.repeat.RepeatStatus; @@ -19,61 +21,47 @@ public class FlowJobConfiguration { @Bean public Job job() { - return jobBuilderFactory.get("job") - .start(startStep()) - .next(decider()) - .from(decider()).on("ODD").to(oddStep()) - .from(decider()).on("EVEN").to(evenStep()) - .from(oddStep()).on("*").to(decider()) + return jobBuilderFactory.get("batchJob") + .start(flow()) + .next(step3()) .end() .build(); } @Bean - public Step startStep() { - return stepBuilderFactory.get("startStep") + public Step step1() { + return stepBuilderFactory.get("step1") .tasklet((contribution, chunkContext) -> { - System.out.println("This is the start tasklet"); + System.out.println(">> step1 has executed"); return RepeatStatus.FINISHED; }).build(); } @Bean - public Step evenStep() { - return stepBuilderFactory.get("evenStep") + public Step step2() { + return stepBuilderFactory.get("step2") .tasklet((contribution, chunkContext) -> { - System.out.println(">>EvenStep has executed"); + System.out.println(">> step2 has executed"); return RepeatStatus.FINISHED; }).build(); } @Bean - public Step oddStep() { - return stepBuilderFactory.get("oddStep") + public Step step3() { + return stepBuilderFactory.get("step3") .tasklet((contribution, chunkContext) -> { - System.out.println(">>OddStep has executed"); + System.out.println(">> step3 has executed"); return RepeatStatus.FINISHED; }).build(); } @Bean - public JobExecutionDecider decider() { - return new CustomDecider(); - } - - public static class CustomDecider implements JobExecutionDecider { - - private int count = 0; + public Flow flow() { + FlowBuilder flowBuilder = new FlowBuilder<>("flow"); - @Override - public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) { - count++; + flowBuilder.start(step1()) + .next(step2()) + .end(); - if(count % 2 == 0) { - return new FlowExecutionStatus("EVEN"); - } - else { - return new FlowExecutionStatus("ODD"); - } - } + return flowBuilder.build(); } } From 0a982b5011ea7af8e413ba1798a9c8253cc018ce Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 13:47:15 +0900 Subject: [PATCH 036/135] spring batch --- .../FlowJobConfiguration.java | 67 ------------------- .../JobScope_StepScope_Configuration.java | 47 +++++++++++++ 2 files changed, 47 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java diff --git a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java deleted file mode 100644 index a4dd1ea..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/FlowJobConfiguration.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.RequiredArgsConstructor; -import org.springframework.batch.core.*; -import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.job.builder.FlowBuilder; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.job.flow.FlowExecutionStatus; -import org.springframework.batch.core.job.flow.JobExecutionDecider; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@RequiredArgsConstructor -@Configuration -public class FlowJobConfiguration { - - private final JobBuilderFactory jobBuilderFactory; - private final StepBuilderFactory stepBuilderFactory; - - @Bean - public Job job() { - return jobBuilderFactory.get("batchJob") - .start(flow()) - .next(step3()) - .end() - .build(); - } - @Bean - public Step step1() { - return stepBuilderFactory.get("step1") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step1 has executed"); - return RepeatStatus.FINISHED; - }).build(); - } - - @Bean - public Step step2() { - return stepBuilderFactory.get("step2") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step2 has executed"); - return RepeatStatus.FINISHED; - }).build(); - } - - @Bean - public Step step3() { - return stepBuilderFactory.get("step3") - .tasklet((contribution, chunkContext) -> { - System.out.println(">> step3 has executed"); - return RepeatStatus.FINISHED; - }).build(); - } - - @Bean - public Flow flow() { - FlowBuilder flowBuilder = new FlowBuilder<>("flow"); - - flowBuilder.start(step1()) - .next(step2()) - .end(); - - return flowBuilder.build(); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java new file mode 100644 index 0000000..46d132f --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java @@ -0,0 +1,47 @@ +package io.springbatch.springbatchlecture; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.*; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.job.builder.FlowBuilder; +import org.springframework.batch.core.job.flow.Flow; +import org.springframework.batch.core.job.flow.FlowExecutionStatus; +import org.springframework.batch.core.job.flow.JobExecutionDecider; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@RequiredArgsConstructor +@Configuration +public class JobScope_StepScope_Configuration { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job job() { + return jobBuilderFactory.get("batchJob") + .start(step1()) + .build(); + } + + @Bean + public Step step1() { + return stepBuilderFactory.get("step1") + .tasklet(tasklet(null)) + .build(); + } + + @Bean + @StepScope + public Tasklet tasklet(@Value("#{jobParameters['message']}") String message) { + return (stepContribution, chunkContext) -> { + System.out.println(message); + return RepeatStatus.FINISHED; + }; + } +} From 5f09d093211b65256076be59ed0b7eaaab367878 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:25:17 +0900 Subject: [PATCH 037/135] spring batch --- .../springbatchlecture/JobListener.java | 17 ++++++++ .../JobScope_StepScope_Configuration.java | 40 +++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/JobListener.java diff --git a/src/main/java/io/springbatch/springbatchlecture/JobListener.java b/src/main/java/io/springbatch/springbatchlecture/JobListener.java new file mode 100644 index 0000000..66fc798 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/JobListener.java @@ -0,0 +1,17 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobExecutionListener; + +public class JobListener implements JobExecutionListener { + + @Override + public void beforeJob(JobExecution jobExecution) { + jobExecution.getExecutionContext().putString("name", "user1"); + } + + @Override + public void afterJob(JobExecution jobExecution) { + + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java index 46d132f..ad420f0 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.JobScope; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.job.builder.FlowBuilder; @@ -25,23 +26,54 @@ public class JobScope_StepScope_Configuration { @Bean public Job job() { return jobBuilderFactory.get("batchJob") - .start(step1()) + .start(step1(null)) + .next(step2()) + .listener(new JobListener()) .build(); } @Bean - public Step step1() { + @JobScope + public Step step1(@Value("#{jobExecutionContext['name']}") String name) { + System.out.println("jobExecutionContext['name'] : " + name); return stepBuilderFactory.get("step1") - .tasklet(tasklet(null)) + .tasklet(tasklet1(null)) + .build(); + } + + @Bean + public Step step2() { + return stepBuilderFactory.get("step2") + .tasklet(tasklet2(null)) + .listener(new StepExecutionListener() { + @Override + public void beforeStep(StepExecution stepExecution) { + stepExecution.getExecutionContext().putString("year", "2021"); + } + + @Override + public ExitStatus afterStep(StepExecution stepExecution) { + return null; + } + }) .build(); } @Bean @StepScope - public Tasklet tasklet(@Value("#{jobParameters['message']}") String message) { + public Tasklet tasklet1(@Value("#{jobParameters['message']}") String message) { return (stepContribution, chunkContext) -> { System.out.println(message); return RepeatStatus.FINISHED; }; } + + @Bean + @StepScope + public Tasklet tasklet2(@Value("#{stepExecutionContext['year']}") String year) { + return (stepContribution, chunkContext) -> { + System.out.println(year); + return RepeatStatus.FINISHED; + }; + } } From ad78b6712c58bb200a3bf8d68475f365b568688c Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:30:15 +0900 Subject: [PATCH 038/135] spring batch --- .../JobScope_StepScope_Configuration.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java index ad420f0..4d52bc5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java @@ -10,6 +10,7 @@ import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.JobExecutionDecider; +import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Value; @@ -28,51 +29,34 @@ public Job job() { return jobBuilderFactory.get("batchJob") .start(step1(null)) .next(step2()) - .listener(new JobListener()) .build(); } @Bean @JobScope - public Step step1(@Value("#{jobExecutionContext['name']}") String name) { - System.out.println("jobExecutionContext['name'] : " + name); + public Step step1(@Value("#{jobParameters['message']}") String message) { + + System.out.println("jobParameters['message'] : " + message); return stepBuilderFactory.get("step1") - .tasklet(tasklet1(null)) + .tasklet(tasklet1()) .build(); } @Bean public Step step2() { return stepBuilderFactory.get("step2") - .tasklet(tasklet2(null)) - .listener(new StepExecutionListener() { - @Override - public void beforeStep(StepExecution stepExecution) { - stepExecution.getExecutionContext().putString("year", "2021"); - } - - @Override - public ExitStatus afterStep(StepExecution stepExecution) { - return null; - } + .tasklet((contribution, chunkContext) -> { + System.out.println("step2 has executed"); + return RepeatStatus.FINISHED; }) .build(); } @Bean @StepScope - public Tasklet tasklet1(@Value("#{jobParameters['message']}") String message) { - return (stepContribution, chunkContext) -> { - System.out.println(message); - return RepeatStatus.FINISHED; - }; - } - - @Bean - @StepScope - public Tasklet tasklet2(@Value("#{stepExecutionContext['year']}") String year) { + public Tasklet tasklet1() { return (stepContribution, chunkContext) -> { - System.out.println(year); + System.out.println("tasklet1 has executed"); return RepeatStatus.FINISHED; }; } From f83916245acfe89c99947bfd075e449d81895430 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:37:16 +0900 Subject: [PATCH 039/135] spring batch --- ...iguration.java => ChunkConfiguration.java} | 31 ++++++++++--------- .../springbatchlecture/JobListener.java | 17 ---------- 2 files changed, 16 insertions(+), 32 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{JobScope_StepScope_Configuration.java => ChunkConfiguration.java} (72%) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/JobListener.java diff --git a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java similarity index 72% rename from src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java rename to src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java index 4d52bc5..3ae550e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JobScope_StepScope_Configuration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java @@ -12,14 +12,19 @@ import org.springframework.batch.core.job.flow.JobExecutionDecider; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.Arrays; +import java.util.List; + @RequiredArgsConstructor @Configuration -public class JobScope_StepScope_Configuration { +public class ChunkConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -27,18 +32,23 @@ public class JobScope_StepScope_Configuration { @Bean public Job job() { return jobBuilderFactory.get("batchJob") - .start(step1(null)) + .start(step1()) .next(step2()) .build(); } @Bean @JobScope - public Step step1(@Value("#{jobParameters['message']}") String message) { - - System.out.println("jobParameters['message'] : " + message); + public Step step1() { return stepBuilderFactory.get("step1") - .tasklet(tasklet1()) + .chunk(3) + .reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3"))) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { + items.forEach(item -> System.out.println(item)); + } + }) .build(); } @@ -51,13 +61,4 @@ public Step step2() { }) .build(); } - - @Bean - @StepScope - public Tasklet tasklet1() { - return (stepContribution, chunkContext) -> { - System.out.println("tasklet1 has executed"); - return RepeatStatus.FINISHED; - }; - } } diff --git a/src/main/java/io/springbatch/springbatchlecture/JobListener.java b/src/main/java/io/springbatch/springbatchlecture/JobListener.java deleted file mode 100644 index 66fc798..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/JobListener.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobExecutionListener; - -public class JobListener implements JobExecutionListener { - - @Override - public void beforeJob(JobExecution jobExecution) { - jobExecution.getExecutionContext().putString("name", "user1"); - } - - @Override - public void afterJob(JobExecution jobExecution) { - - } -} From e0e4a0eaeaf1ac2b5251820f95dd778ef212b835 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:38:25 +0900 Subject: [PATCH 040/135] spring batch --- .../io/springbatch/springbatchlecture/ChunkConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java index 3ae550e..65c1f5c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java @@ -42,7 +42,7 @@ public Job job() { public Step step1() { return stepBuilderFactory.get("step1") .chunk(3) - .reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3"))) + .reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3","item4", "item5", "item6"))) .writer(new ItemWriter() { @Override public void write(List items) throws Exception { From 8a57b3ce9b36fb8b4f81d5a75b6911ecdcef7e14 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:40:14 +0900 Subject: [PATCH 041/135] spring batch --- .../springbatch/springbatchlecture/ChunkConfiguration.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java index 65c1f5c..c48f2f8 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java @@ -12,6 +12,7 @@ import org.springframework.batch.core.job.flow.JobExecutionDecider; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; @@ -43,6 +44,12 @@ public Step step1() { return stepBuilderFactory.get("step1") .chunk(3) .reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3","item4", "item5", "item6"))) + .processor(new ItemProcessor() { + @Override + public String process(String item) throws Exception { + return "my_" + item; + } + }) .writer(new ItemWriter() { @Override public void write(List items) throws Exception { From 6b99c2d0832fe6927797e1e3e309413029862a6a Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:41:20 +0900 Subject: [PATCH 042/135] spring batch --- ...onfiguration.java => ChunkOrientedTaskletConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ChunkConfiguration.java => ChunkOrientedTaskletConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java index c48f2f8..c98aace 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java @@ -25,7 +25,7 @@ @RequiredArgsConstructor @Configuration -public class ChunkConfiguration { +public class ChunkOrientedTaskletConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 83e3496944750fff10407e3900f7c429a79552d3 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:46:17 +0900 Subject: [PATCH 043/135] spring batch --- .../springbatchlecture/ChunkOrientedTaskletConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java index c98aace..214b64d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java @@ -68,4 +68,4 @@ public Step step2() { }) .build(); } -} +} \ No newline at end of file From 67249ac4cdc245b3a70c50dac2388adfc42e3606 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:46:51 +0900 Subject: [PATCH 044/135] spring batch --- .../springbatchlecture/ChunkOrientedTaskletConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java index 214b64d..c98aace 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java @@ -68,4 +68,4 @@ public Step step2() { }) .build(); } -} \ No newline at end of file +} From 5bd205a4e6eadc3c126f252d55ee80206fd492fb Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 14:48:11 +0900 Subject: [PATCH 045/135] spring batch --- ...a => ItemReader_ItemProcessor_ItemWriter_Configuration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ChunkOrientedTaskletConfiguration.java => ItemReader_ItemProcessor_ItemWriter_Configuration.java} (97%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java similarity index 97% rename from src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java index c98aace..06c7809 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkOrientedTaskletConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java @@ -25,7 +25,7 @@ @RequiredArgsConstructor @Configuration -public class ChunkOrientedTaskletConfiguration { +public class ItemReader_ItemProcessor_ItemWriter_Configuration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From c6feb6647f51de2cab670af5cdc6379efd500853 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 15:49:46 +0900 Subject: [PATCH 046/135] spring batch --- .../CustomItemProcessor.java | 16 ++++++++++ .../springbatchlecture/CustomItemReader.java | 23 +++++++++++++ .../springbatchlecture/CustomItemWriter.java | 13 ++++++++ .../springbatchlecture/Customer.java | 10 ++++++ ...temProcessor_ItemWriter_Configuration.java | 32 +++++++++++-------- 5 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java new file mode 100644 index 0000000..e1e99bd --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java @@ -0,0 +1,16 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; + +import java.util.ArrayList; +import java.util.List; + +public class CustomItemProcessor implements ItemProcessor { + + @Override + public Customer process(Customer customer) throws Exception { + customer.setName(customer.getName().toUpperCase()); + return null; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java new file mode 100644 index 0000000..2bab6da --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java @@ -0,0 +1,23 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemReader; + +import java.util.ArrayList; +import java.util.List; + +public class CustomItemReader implements ItemReader { + + private List list; + + public CustomItemReader(List list) { + this.list = new ArrayList<>(list); + } + + @Override + public Customer read() { + if (!list.isEmpty()) { + return list.remove(0); + } + return null; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java new file mode 100644 index 0000000..3edafbb --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java @@ -0,0 +1,13 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemWriter; + +import java.util.List; + +public class CustomItemWriter implements ItemWriter { + + @Override + public void write(List items) throws Exception { + items.forEach(item -> System.out.println(item)); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java new file mode 100644 index 0000000..14b5dfe --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -0,0 +1,10 @@ +package io.springbatch.springbatchlecture; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Customer { + private String name; +} diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java index 06c7809..ebd7d60 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java @@ -13,6 +13,7 @@ import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; @@ -43,22 +44,27 @@ public Job job() { public Step step1() { return stepBuilderFactory.get("step1") .chunk(3) - .reader(new ListItemReader<>(Arrays.asList("item1", "item2", "item3","item4", "item5", "item6"))) - .processor(new ItemProcessor() { - @Override - public String process(String item) throws Exception { - return "my_" + item; - } - }) - .writer(new ItemWriter() { - @Override - public void write(List items) throws Exception { - items.forEach(item -> System.out.println(item)); - } - }) + .reader(itemReader()) + .processor(itemProcessor()) + .writer(itemWriter()) .build(); } + @Bean + public ItemReader itemReader() { + return new CustomItemReader(Arrays.asList(new Customer("user1"), new Customer("user2"), new Customer("user3"))); + } + + @Bean + public ItemProcessor itemProcessor() { + return new CustomItemProcessor(); + } + + @Bean + public ItemWriter itemWriter() { + return new CustomItemWriter(); + } + @Bean public Step step2() { return stepBuilderFactory.get("step2") From c8f202695eb37d1abe0ceda30a84a128621551a0 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sun, 20 Jun 2021 16:26:45 +0900 Subject: [PATCH 047/135] spring batch --- ..._Configuration.java => ChunkArchitectureConfiguration.java} | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{ItemReader_ItemProcessor_ItemWriter_Configuration.java => ChunkArchitectureConfiguration.java} (97%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java b/src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java similarity index 97% rename from src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java rename to src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java index ebd7d60..d228256 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReader_ItemProcessor_ItemWriter_Configuration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class ItemReader_ItemProcessor_ItemWriter_Configuration { +public class ChunkArchitectureConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -40,7 +40,6 @@ public Job job() { } @Bean - @JobScope public Step step1() { return stepBuilderFactory.get("step1") .chunk(3) From 2623620230c6713e1fd9478da8b1e9eace08f745 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Mon, 21 Jun 2021 23:20:50 +0900 Subject: [PATCH 048/135] spring batch --- ...chitectureConfiguration.java => FlatFilesConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ChunkArchitectureConfiguration.java => FlatFilesConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index d228256..c09f85f 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ChunkArchitectureConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class ChunkArchitectureConfiguration { +public class FlatFilesConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From cef464bebe774d3445a9c4df82d0d5864d934d51 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Mon, 21 Jun 2021 23:42:44 +0900 Subject: [PATCH 049/135] spring batch --- .../CustomItemProcessor.java | 16 ------------ .../springbatchlecture/CustomItemReader.java | 23 ----------------- .../springbatchlecture/CustomItemWriter.java | 13 ---------- .../springbatchlecture/Customer.java | 6 +++-- .../CustomerFieldSetMapper.java | 18 +++++++++++++ .../springbatchlecture/DefaultLineMapper.java | 25 +++++++++++++++++++ .../FlatFilesConfiguration.java | 15 ----------- 7 files changed, 47 insertions(+), 69 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java deleted file mode 100644 index e1e99bd..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; -import org.springframework.batch.item.ItemReader; - -import java.util.ArrayList; -import java.util.List; - -public class CustomItemProcessor implements ItemProcessor { - - @Override - public Customer process(Customer customer) throws Exception { - customer.setName(customer.getName().toUpperCase()); - return null; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java deleted file mode 100644 index 2bab6da..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemReader; - -import java.util.ArrayList; -import java.util.List; - -public class CustomItemReader implements ItemReader { - - private List list; - - public CustomItemReader(List list) { - this.list = new ArrayList<>(list); - } - - @Override - public Customer read() { - if (!list.isEmpty()) { - return list.remove(0); - } - return null; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java deleted file mode 100644 index 3edafbb..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemWriter.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemWriter; - -import java.util.List; - -public class CustomItemWriter implements ItemWriter { - - @Override - public void write(List items) throws Exception { - items.forEach(item -> System.out.println(item)); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index 14b5dfe..e46feba 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -1,10 +1,12 @@ package io.springbatch.springbatchlecture; -import lombok.AllArgsConstructor; import lombok.Data; @Data -@AllArgsConstructor public class Customer { + private String name; + private String year; + private int age; + } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java b/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java new file mode 100644 index 0000000..ff387ba --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java @@ -0,0 +1,18 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.file.mapping.FieldSetMapper; +import org.springframework.batch.item.file.transform.FieldSet; + +public class CustomerFieldSetMapper implements FieldSetMapper { + + @Override + public Customer mapFieldSet(FieldSet fieldSet) { + Customer customer = new Customer(); + + customer.setName(fieldSet.readString(0)); + customer.setYear(fieldSet.readString(1)); + customer.setAge(fieldSet.readInt(2)); + + return customer; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java b/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java new file mode 100644 index 0000000..85518f3 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java @@ -0,0 +1,25 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.file.LineMapper; +import org.springframework.batch.item.file.mapping.FieldSetMapper; +import org.springframework.batch.item.file.transform.LineTokenizer; + +public class DefaultLineMapper implements LineMapper { + + private LineTokenizer tokenizer; + + private FieldSetMapper fieldSetMapper; + + + public T mapLine(String line, int lineNumber) throws Exception { + return fieldSetMapper.mapFieldSet(tokenizer.tokenize(line)); + } + + public void setLineTokenizer(LineTokenizer tokenizer) { + this.tokenizer = tokenizer; + } + + public void setFieldSetMapper(FieldSetMapper fieldSetMapper) { + this.fieldSetMapper = fieldSetMapper; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index c09f85f..f8e27ba 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -49,21 +49,6 @@ public Step step1() { .build(); } - @Bean - public ItemReader itemReader() { - return new CustomItemReader(Arrays.asList(new Customer("user1"), new Customer("user2"), new Customer("user3"))); - } - - @Bean - public ItemProcessor itemProcessor() { - return new CustomItemProcessor(); - } - - @Bean - public ItemWriter itemWriter() { - return new CustomItemWriter(); - } - @Bean public Step step2() { return stepBuilderFactory.get("step2") From cbb4d881739c1d123e52ff75b699581e8b627d06 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 11:39:47 +0900 Subject: [PATCH 050/135] spirng batch --- ...a => FlatFilesDelimitedConfiguration.java} | 29 +++++++++++++++++-- src/main/resources/customer.csv | 11 +++++++ 2 files changed, 37 insertions(+), 3 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{FlatFilesConfiguration.java => FlatFilesDelimitedConfiguration.java} (65%) create mode 100644 src/main/resources/customer.csv diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java similarity index 65% rename from src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java index f8e27ba..98ab91c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java @@ -15,18 +15,22 @@ import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; import java.util.Arrays; import java.util.List; @RequiredArgsConstructor @Configuration -public class FlatFilesConfiguration { +public class FlatFilesDelimitedConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -44,11 +48,30 @@ public Step step1() { return stepBuilderFactory.get("step1") .chunk(3) .reader(itemReader()) - .processor(itemProcessor()) - .writer(itemWriter()) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { + items.forEach(item -> System.out.println(item)); + } + }) .build(); } + public FlatFileItemReader itemReader() { + return new FlatFileItemReaderBuilder() + .name("flatFile") + .resource(new ClassPathResource("customer.csv")) + .lineMapper(new DefaultLineMapper<>()) + .fieldSetMapper(new CustomerFieldSetMapper()) + .lineTokenizer(new DelimitedLineTokenizer()) + .targetType(Customer.class) + .linesToSkip(1) + .delimited().delimiter("|") + .names("name","year","age") + .build(); + } + + @Bean public Step step2() { return stepBuilderFactory.get("step2") diff --git a/src/main/resources/customer.csv b/src/main/resources/customer.csv new file mode 100644 index 0000000..efc4b5c --- /dev/null +++ b/src/main/resources/customer.csv @@ -0,0 +1,11 @@ +name,year,age +"user1,1974,48", +"user2,1975,47", +"user3,1976,46", +"user4,1977,45", +"user5,1978,44", +"user6,1979,43", +"user7,1980,42", +"user8,1981,41", +"user9,1982,40", +"user10,1983,39" \ No newline at end of file From 525f6fc3a50bb28d7b672fcb19fe38023f58ccdc Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 14:04:30 +0900 Subject: [PATCH 051/135] spirng batch --- .../springbatchlecture/DefaultLineMapper.java | 25 ------------------- .../FlatFilesDelimitedConfiguration.java | 5 ++-- src/main/resources/customer.csv | 20 +++++++-------- 3 files changed, 12 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java diff --git a/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java b/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java deleted file mode 100644 index 85518f3..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/DefaultLineMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.file.LineMapper; -import org.springframework.batch.item.file.mapping.FieldSetMapper; -import org.springframework.batch.item.file.transform.LineTokenizer; - -public class DefaultLineMapper implements LineMapper { - - private LineTokenizer tokenizer; - - private FieldSetMapper fieldSetMapper; - - - public T mapLine(String line, int lineNumber) throws Exception { - return fieldSetMapper.mapFieldSet(tokenizer.tokenize(line)); - } - - public void setLineTokenizer(LineTokenizer tokenizer) { - this.tokenizer = tokenizer; - } - - public void setFieldSetMapper(FieldSetMapper fieldSetMapper) { - this.fieldSetMapper = fieldSetMapper; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java index 98ab91c..92cf54f 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java @@ -61,12 +61,11 @@ public FlatFileItemReader itemReader() { return new FlatFileItemReaderBuilder() .name("flatFile") .resource(new ClassPathResource("customer.csv")) - .lineMapper(new DefaultLineMapper<>()) .fieldSetMapper(new CustomerFieldSetMapper()) - .lineTokenizer(new DelimitedLineTokenizer()) +// .lineTokenizer(new DelimitedLineTokenizer()) .targetType(Customer.class) .linesToSkip(1) - .delimited().delimiter("|") + .delimited().delimiter(",") .names("name","year","age") .build(); } diff --git a/src/main/resources/customer.csv b/src/main/resources/customer.csv index efc4b5c..c9c3af0 100644 --- a/src/main/resources/customer.csv +++ b/src/main/resources/customer.csv @@ -1,11 +1,11 @@ name,year,age -"user1,1974,48", -"user2,1975,47", -"user3,1976,46", -"user4,1977,45", -"user5,1978,44", -"user6,1979,43", -"user7,1980,42", -"user8,1981,41", -"user9,1982,40", -"user10,1983,39" \ No newline at end of file +user1,1974,48 +user2,1975,47 +user3,1976,46 +user4,1977,45 +user5,1978,44 +user6,1979,43 +user7,1980,42 +user8,1981,41 +user9,1982,40 +user10,1983,39 \ No newline at end of file From 8f904beec528b617087df1760e0d7ea267571d72 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 14:33:59 +0900 Subject: [PATCH 052/135] spirng batch --- .../springbatchlecture/FlatFilesDelimitedConfiguration.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java index 92cf54f..cd31adf 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java @@ -17,6 +17,7 @@ import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.repeat.RepeatStatus; @@ -61,7 +62,8 @@ public FlatFileItemReader itemReader() { return new FlatFileItemReaderBuilder() .name("flatFile") .resource(new ClassPathResource("customer.csv")) - .fieldSetMapper(new CustomerFieldSetMapper()) + .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) +// .fieldSetMapper(new CustomerFieldSetMapper()) // .lineTokenizer(new DelimitedLineTokenizer()) .targetType(Customer.class) .linesToSkip(1) From c8b461fb073cc3e85a2acf350242399ab4c8f4a6 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 14:37:14 +0900 Subject: [PATCH 053/135] spirng batch --- ...onfiguration.java => FlatFilesFixedLengthConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{FlatFilesDelimitedConfiguration.java => FlatFilesFixedLengthConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java index cd31adf..7a12bd5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesDelimitedConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java @@ -31,7 +31,7 @@ @RequiredArgsConstructor @Configuration -public class FlatFilesDelimitedConfiguration { +public class FlatFilesFixedLengthConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 9effd1a9295fa74d9c758a14fb27d8560158375f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 14:57:09 +0900 Subject: [PATCH 054/135] spirng batch --- .../springbatchlecture/FlatFilesFixedLengthConfiguration.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java index 7a12bd5..8e0bb9e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java @@ -63,8 +63,6 @@ public FlatFileItemReader itemReader() { .name("flatFile") .resource(new ClassPathResource("customer.csv")) .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) -// .fieldSetMapper(new CustomerFieldSetMapper()) -// .lineTokenizer(new DelimitedLineTokenizer()) .targetType(Customer.class) .linesToSkip(1) .delimited().delimiter(",") From 79e69c11cf129ced3880cfa5010c5ee9deefcecc Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 15:12:58 +0900 Subject: [PATCH 055/135] spirng batch --- .../FlatFilesFixedLengthConfiguration.java | 23 +++++-------------- src/main/resources/customer.csv | 11 --------- src/main/resources/customer.txt | 11 +++++++++ 3 files changed, 17 insertions(+), 28 deletions(-) delete mode 100644 src/main/resources/customer.csv create mode 100644 src/main/resources/customer.txt diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java index 8e0bb9e..08278af 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java @@ -3,30 +3,17 @@ import lombok.RequiredArgsConstructor; import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; -import org.springframework.batch.core.configuration.annotation.JobScope; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepScope; -import org.springframework.batch.core.job.builder.FlowBuilder; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.job.flow.FlowExecutionStatus; -import org.springframework.batch.core.job.flow.JobExecutionDecider; -import org.springframework.batch.core.scope.context.ChunkContext; -import org.springframework.batch.core.step.tasklet.Tasklet; -import org.springframework.batch.item.ItemProcessor; -import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; -import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; -import org.springframework.batch.item.support.ListItemReader; +import org.springframework.batch.item.file.transform.Range; import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; -import java.util.Arrays; import java.util.List; @RequiredArgsConstructor @@ -61,16 +48,18 @@ public void write(List items) throws Exception { public FlatFileItemReader itemReader() { return new FlatFileItemReaderBuilder() .name("flatFile") - .resource(new ClassPathResource("customer.csv")) + .resource(new ClassPathResource("customer.txt")) .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) .targetType(Customer.class) .linesToSkip(1) - .delimited().delimiter(",") + .fixedLength() + .addColumns(new Range(1,5)) + .addColumns(new Range(6,9)) + .addColumns(new Range(10,11)) .names("name","year","age") .build(); } - @Bean public Step step2() { return stepBuilderFactory.get("step2") diff --git a/src/main/resources/customer.csv b/src/main/resources/customer.csv deleted file mode 100644 index c9c3af0..0000000 --- a/src/main/resources/customer.csv +++ /dev/null @@ -1,11 +0,0 @@ -name,year,age -user1,1974,48 -user2,1975,47 -user3,1976,46 -user4,1977,45 -user5,1978,44 -user6,1979,43 -user7,1980,42 -user8,1981,41 -user9,1982,40 -user10,1983,39 \ No newline at end of file diff --git a/src/main/resources/customer.txt b/src/main/resources/customer.txt new file mode 100644 index 0000000..b084b33 --- /dev/null +++ b/src/main/resources/customer.txt @@ -0,0 +1,11 @@ +name,year,age +user1197448 +user2197547 +user3197646 +user4197745 +user5197844 +user6197943 +user7198042 +user8198141 +user9198240 +user10198339 \ No newline at end of file From 9f0ed54c76a329876cc44cd046e301271d3de5cb Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 15:14:25 +0900 Subject: [PATCH 056/135] spirng batch --- .../springbatchlecture/FlatFilesFixedLengthConfiguration.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java index 08278af..5f8efa5 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java @@ -56,6 +56,9 @@ public FlatFileItemReader itemReader() { .addColumns(new Range(1,5)) .addColumns(new Range(6,9)) .addColumns(new Range(10,11)) + /*.addColumns(new Range(1)) + .addColumns(new Range(6)) + .addColumns(new Range(10))*/ .names("name","year","age") .build(); } From 4f9e24fd886b8933c9187368ecf5dc70c7114790 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 15:15:36 +0900 Subject: [PATCH 057/135] spirng batch --- .../springbatchlecture/FlatFilesFixedLengthConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java index 5f8efa5..b0fb33a 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java @@ -60,6 +60,7 @@ public FlatFileItemReader itemReader() { .addColumns(new Range(6)) .addColumns(new Range(10))*/ .names("name","year","age") + .strict(false) .build(); } From 719672b1524729365af694dced367fef4d136fe0 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 17:45:22 +0900 Subject: [PATCH 058/135] spirng batch --- ...onfiguration.java => ExceptionHandlingConfiguration.java} | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{FlatFilesFixedLengthConfiguration.java => ExceptionHandlingConfiguration.java} (93%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java similarity index 93% rename from src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java index b0fb33a..f203e4c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFixedLengthConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java @@ -18,7 +18,7 @@ @RequiredArgsConstructor @Configuration -public class FlatFilesFixedLengthConfiguration { +public class ExceptionHandlingConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -56,9 +56,6 @@ public FlatFileItemReader itemReader() { .addColumns(new Range(1,5)) .addColumns(new Range(6,9)) .addColumns(new Range(10,11)) - /*.addColumns(new Range(1)) - .addColumns(new Range(6)) - .addColumns(new Range(10))*/ .names("name","year","age") .strict(false) .build(); From 09dbda542df3dc39b4efcbeb2d1e17255f5c3763 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 17:56:27 +0900 Subject: [PATCH 059/135] spirng batch --- .../springbatchlecture/ExceptionHandlingConfiguration.java | 2 +- src/main/resources/customer.txt | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java index f203e4c..d6f5e8c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java @@ -53,11 +53,11 @@ public FlatFileItemReader itemReader() { .targetType(Customer.class) .linesToSkip(1) .fixedLength() + .strict(false) .addColumns(new Range(1,5)) .addColumns(new Range(6,9)) .addColumns(new Range(10,11)) .names("name","year","age") - .strict(false) .build(); } diff --git a/src/main/resources/customer.txt b/src/main/resources/customer.txt index b084b33..7a47396 100644 --- a/src/main/resources/customer.txt +++ b/src/main/resources/customer.txt @@ -1,5 +1,5 @@ name,year,age -user1197448 +user11974481 user2197547 user3197646 user4197745 @@ -7,5 +7,4 @@ user5197844 user6197943 user7198042 user8198141 -user9198240 -user10198339 \ No newline at end of file +user9198240 \ No newline at end of file From 25f3b1f6b6836153c5e9ac63cb94d193e6d20d89 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 17:58:33 +0900 Subject: [PATCH 060/135] spirng batch --- ...xceptionHandlingConfiguration.java => XMLConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ExceptionHandlingConfiguration.java => XMLConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index d6f5e8c..769127e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ExceptionHandlingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -18,7 +18,7 @@ @RequiredArgsConstructor @Configuration -public class ExceptionHandlingConfiguration { +public class XMLConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 950e788280d74ca324ce57a8f419fe3b64283283 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 22 Jun 2021 18:52:24 +0900 Subject: [PATCH 061/135] spirng batch --- .../io/springbatch/springbatchlecture/XMLConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index 769127e..6cb33c0 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -48,7 +48,7 @@ public void write(List items) throws Exception { public FlatFileItemReader itemReader() { return new FlatFileItemReaderBuilder() .name("flatFile") - .resource(new ClassPathResource("customer.txt")) + .resource(new ClassPathResource("customer.xml")) .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) .targetType(Customer.class) .linesToSkip(1) From 95b198d5b54f05af5e6c58d97cf6ca360a32b240 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 13:49:45 +0900 Subject: [PATCH 062/135] spirng batch --- pom.xml | 10 ++++++++++ .../springbatchlecture/Customer.java | 12 ------------ .../CustomerFieldSetMapper.java | 18 ------------------ .../springbatchlecture/XMLConfiguration.java | 14 +------------- src/main/resources/customer.txt | 10 ---------- 5 files changed, 11 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java delete mode 100644 src/main/resources/customer.txt diff --git a/pom.xml b/pom.xml index 42ddc51..5a471be 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,16 @@ lombok true + + org.springframework + spring-oxm + 5.3.7 + + + com.thoughtworks.xstream + xstream + 1.4.16 + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java deleted file mode 100644 index e46feba..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.Data; - -@Data -public class Customer { - - private String name; - private String year; - private int age; - -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java b/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java deleted file mode 100644 index ff387ba..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomerFieldSetMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.file.mapping.FieldSetMapper; -import org.springframework.batch.item.file.transform.FieldSet; - -public class CustomerFieldSetMapper implements FieldSetMapper { - - @Override - public Customer mapFieldSet(FieldSet fieldSet) { - Customer customer = new Customer(); - - customer.setName(fieldSet.readString(0)); - customer.setYear(fieldSet.readString(1)); - customer.setAge(fieldSet.readInt(2)); - - return customer; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index 6cb33c0..d9f3644 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -46,19 +46,7 @@ public void write(List items) throws Exception { } public FlatFileItemReader itemReader() { - return new FlatFileItemReaderBuilder() - .name("flatFile") - .resource(new ClassPathResource("customer.xml")) - .fieldSetMapper(new BeanWrapperFieldSetMapper<>()) - .targetType(Customer.class) - .linesToSkip(1) - .fixedLength() - .strict(false) - .addColumns(new Range(1,5)) - .addColumns(new Range(6,9)) - .addColumns(new Range(10,11)) - .names("name","year","age") - .build(); + return null; } @Bean diff --git a/src/main/resources/customer.txt b/src/main/resources/customer.txt deleted file mode 100644 index 7a47396..0000000 --- a/src/main/resources/customer.txt +++ /dev/null @@ -1,10 +0,0 @@ -name,year,age -user11974481 -user2197547 -user3197646 -user4197745 -user5197844 -user6197943 -user7198042 -user8198141 -user9198240 \ No newline at end of file From b7bbfea77d3264c92dca4d3de3eab0c8fed9fbfe Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 13:51:09 +0900 Subject: [PATCH 063/135] spirng batch --- .../java/io/springbatch/springbatchlecture/XMLConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index d9f3644..7da3a44 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -59,3 +59,4 @@ public Step step2() { .build(); } } + From aedd02a452f7764d055bde32a4738d021ff7fccd Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 14:28:02 +0900 Subject: [PATCH 064/135] spirng batch --- .../springbatchlecture/Customer.java | 30 +++++++ .../springbatchlecture/XMLConfiguration.java | 84 +++++++++++++------ src/main/resources/customer.xml | 18 ++++ 3 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java create mode 100644 src/main/resources/customer.xml diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java new file mode 100644 index 0000000..caaf9cb --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -0,0 +1,30 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.springbatch.springbatchlecture; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +import java.util.Date; + +@Data +public class Customer { + + private final long id; + private final String name; + private final int age; + +} \ No newline at end of file diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index 7da3a44..1572277 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -4,17 +4,18 @@ import org.springframework.batch.core.*; 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.ItemWriter; -import org.springframework.batch.item.file.FlatFileItemReader; -import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder; -import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; -import org.springframework.batch.item.file.transform.Range; -import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.item.xml.StaxEventItemReader; +import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.oxm.xstream.XStreamMarshaller; -import java.util.List; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; @RequiredArgsConstructor @Configuration @@ -26,37 +27,72 @@ public class XMLConfiguration { @Bean public Job job() { return jobBuilderFactory.get("batchJob") + .incrementer(new RunIdIncrementer()) .start(step1()) - .next(step2()) .build(); } @Bean public Step step1() { return stepBuilderFactory.get("step1") - .chunk(3) - .reader(itemReader()) - .writer(new ItemWriter() { - @Override - public void write(List items) throws Exception { - items.forEach(item -> System.out.println(item)); - } - }) + .chunk(3) + .reader(customItemReader()) + .writer(customItemWriter()) .build(); } - public FlatFileItemReader itemReader() { - return null; + @Bean + public StaxEventItemReader customItemReader() { + return new StaxEventItemReaderBuilder() + .name("xmlFileItemReader") + .resource(new ClassPathResource("customer.xml")) + .addFragmentRootElements("customer") + .unmarshaller(itemMarshaller()) + .build(); } + /*@Bean + public StaxEventItemReader customItemReader() { + + XStreamMarshaller unmarshaller = new XStreamMarshaller(); + + Map aliases = new HashMap<>(); + aliases.put("customer", Customer.class); + aliases.put("id", Long.class); + aliases.put("firstName", String.class); + aliases.put("lastName", String.class); + aliases.put("birthdate", Date.class); + + unmarshaller.setAliases(aliases); + + StaxEventItemReader reader = new StaxEventItemReader<>(); + + reader.setResource(new ClassPathResource("customers.xml")); + reader.setFragmentRootElementName("customer"); + reader.setUnmarshaller(unmarshaller); + + return reader; + }*/ + @Bean - public Step step2() { - return stepBuilderFactory.get("step2") - .tasklet((contribution, chunkContext) -> { - System.out.println("step2 has executed"); - return RepeatStatus.FINISHED; - }) - .build(); + public ItemWriter customItemWriter() { + return items -> { + for (Customer item : items) { + System.out.println(item.toString()); + } + }; + } + + @Bean + public XStreamMarshaller itemMarshaller() { + Map> aliases = new HashMap<>(); + aliases.put("customer", Customer.class); + aliases.put("id", Long.class); + aliases.put("name", String.class); + aliases.put("age", Integer.class); + XStreamMarshaller xStreamMarshaller = new XStreamMarshaller(); + xStreamMarshaller.setAliases(aliases); + return xStreamMarshaller; } } diff --git a/src/main/resources/customer.xml b/src/main/resources/customer.xml new file mode 100644 index 0000000..3ceaca5 --- /dev/null +++ b/src/main/resources/customer.xml @@ -0,0 +1,18 @@ + + + + 1 + hong gil dong1 + 40 + + + 2 + hong gil dong2 + 42 + + + 3 + hong gil dong3 + 43 + + \ No newline at end of file From 97a168170cbd4a7e91174fd158ff2910f360a759 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 15:20:37 +0900 Subject: [PATCH 065/135] spirng batch --- ...figuration.java => JsonConfiguration.java} | 51 ++++--------------- src/main/resources/customer.json | 17 +++++++ src/main/resources/customer.xml | 18 ------- 3 files changed, 26 insertions(+), 60 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{XMLConfiguration.java => JsonConfiguration.java} (52%) create mode 100644 src/main/resources/customer.json delete mode 100644 src/main/resources/customer.xml diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java similarity index 52% rename from src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java index 1572277..3890031 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java @@ -6,6 +6,9 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.json.JacksonJsonObjectReader; +import org.springframework.batch.item.json.JsonItemReader; +import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; import org.springframework.batch.item.xml.StaxEventItemReader; import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; import org.springframework.context.annotation.Bean; @@ -19,7 +22,7 @@ @RequiredArgsConstructor @Configuration -public class XMLConfiguration { +public class JsonConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -42,38 +45,14 @@ public Step step1() { } @Bean - public StaxEventItemReader customItemReader() { - return new StaxEventItemReaderBuilder() - .name("xmlFileItemReader") - .resource(new ClassPathResource("customer.xml")) - .addFragmentRootElements("customer") - .unmarshaller(itemMarshaller()) + public JsonItemReader customItemReader(){ + return new JsonItemReaderBuilder() + .jsonObjectReader(new JacksonJsonObjectReader<>(Customer.class)) + .resource(new ClassPathResource("/customer.json")) + .name("jsonItemReader") .build(); } - /*@Bean - public StaxEventItemReader customItemReader() { - - XStreamMarshaller unmarshaller = new XStreamMarshaller(); - - Map aliases = new HashMap<>(); - aliases.put("customer", Customer.class); - aliases.put("id", Long.class); - aliases.put("firstName", String.class); - aliases.put("lastName", String.class); - aliases.put("birthdate", Date.class); - - unmarshaller.setAliases(aliases); - - StaxEventItemReader reader = new StaxEventItemReader<>(); - - reader.setResource(new ClassPathResource("customers.xml")); - reader.setFragmentRootElementName("customer"); - reader.setUnmarshaller(unmarshaller); - - return reader; - }*/ - @Bean public ItemWriter customItemWriter() { return items -> { @@ -82,17 +61,5 @@ public ItemWriter customItemWriter() { } }; } - - @Bean - public XStreamMarshaller itemMarshaller() { - Map> aliases = new HashMap<>(); - aliases.put("customer", Customer.class); - aliases.put("id", Long.class); - aliases.put("name", String.class); - aliases.put("age", Integer.class); - XStreamMarshaller xStreamMarshaller = new XStreamMarshaller(); - xStreamMarshaller.setAliases(aliases); - return xStreamMarshaller; - } } diff --git a/src/main/resources/customer.json b/src/main/resources/customer.json new file mode 100644 index 0000000..1ea4379 --- /dev/null +++ b/src/main/resources/customer.json @@ -0,0 +1,17 @@ +[ + { + "id" : 1, + "name" : "hong gil dong1", + "age" : 41 + }, + { + "id" : 2, + "name" : "hong gil dong2", + "age" : 42 + }, + { + "id" : 3, + "name" : "hong gil dong3", + "age" : 43 + } +] \ No newline at end of file diff --git a/src/main/resources/customer.xml b/src/main/resources/customer.xml deleted file mode 100644 index 3ceaca5..0000000 --- a/src/main/resources/customer.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - 1 - hong gil dong1 - 40 - - - 2 - hong gil dong2 - 42 - - - 3 - hong gil dong3 - 43 - - \ No newline at end of file From 4295a2896640ab643120e46d6f9ee8e87b39d5d9 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 15:20:51 +0900 Subject: [PATCH 066/135] spirng batch --- .../io/springbatch/springbatchlecture/JsonConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java index 3890031..a6c5258 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java @@ -48,7 +48,7 @@ public Step step1() { public JsonItemReader customItemReader(){ return new JsonItemReaderBuilder() .jsonObjectReader(new JacksonJsonObjectReader<>(Customer.class)) - .resource(new ClassPathResource("/customer.json")) + .resource(new ClassPathResource("customer.json")) .name("jsonItemReader") .build(); } From 398f6dd526182e5e02c65d5e53d48ab325e62862 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 15:21:42 +0900 Subject: [PATCH 067/135] spirng batch --- .../java/io/springbatch/springbatchlecture/Customer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index caaf9cb..073f39a 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -16,15 +16,17 @@ package io.springbatch.springbatchlecture; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import java.util.Date; @Data +@NoArgsConstructor public class Customer { - private final long id; - private final String name; - private final int age; + private long id; + private String name; + private int age; } \ No newline at end of file From 9cfc48d3f130c14b700c8cc80671fc179aaf4348 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 15:23:05 +0900 Subject: [PATCH 068/135] spirng batch --- .../{JsonConfiguration.java => JdbcCursorConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JsonConfiguration.java => JdbcCursorConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java index a6c5258..d466ecf 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java @@ -22,7 +22,7 @@ @RequiredArgsConstructor @Configuration -public class JsonConfiguration { +public class JdbcCursorConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From eb18542f0e428814266b4934dfde07a67dd0fa85 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:00:17 +0900 Subject: [PATCH 069/135] spirng batch --- .../springbatchlecture/Customer.java | 24 +++++-------------- .../JdbcCursorConfiguration.java | 22 +++++++++++++---- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index 073f39a..6080e08 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -1,20 +1,6 @@ -/* - * Copyright 2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package io.springbatch.springbatchlecture; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; @@ -23,10 +9,12 @@ @Data @NoArgsConstructor +@AllArgsConstructor public class Customer { - private long id; - private String name; - private int age; + private Long Id; + private String firstName; + private String lastName; + private String birthdate; } \ No newline at end of file diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java index d466ecf..a3a4e3c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java @@ -6,16 +6,21 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.database.JdbcCursorItemReader; +import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; import org.springframework.batch.item.xml.StaxEventItemReader; import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.oxm.xstream.XStreamMarshaller; +import javax.sql.DataSource; +import java.sql.Types; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -26,6 +31,7 @@ public class JdbcCursorConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final DataSource dataSource; @Bean public Job job() { @@ -45,11 +51,17 @@ public Step step1() { } @Bean - public JsonItemReader customItemReader(){ - return new JsonItemReaderBuilder() - .jsonObjectReader(new JacksonJsonObjectReader<>(Customer.class)) - .resource(new ClassPathResource("customer.json")) - .name("jsonItemReader") + public JdbcCursorItemReader customItemReader() { + return new JdbcCursorItemReaderBuilder() + .name("jdbcCursorItemReader") + .fetchSize(10) + .sql("select id, firstName, lastName, birthdate from customer where firstName like ? order by lastName, firstName") + .beanRowMapper(Customer.class) + .queryArguments(new String[]{"A%"}, new int[]{Types.VARCHAR}) + .maxItemCount(20) + .currentItemCount(5) + .maxRows(100) + .dataSource(dataSource) .build(); } From 9fbdf829ab5626394a173978c56c61ad45de45f9 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:01:22 +0900 Subject: [PATCH 070/135] spirng batch --- .../springbatchlecture/JdbcCursorConfiguration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java index a3a4e3c..83bec46 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java @@ -58,9 +58,9 @@ public JdbcCursorItemReader customItemReader() { .sql("select id, firstName, lastName, birthdate from customer where firstName like ? order by lastName, firstName") .beanRowMapper(Customer.class) .queryArguments(new String[]{"A%"}, new int[]{Types.VARCHAR}) - .maxItemCount(20) - .currentItemCount(5) - .maxRows(100) +// .maxItemCount(20) +// .currentItemCount(5) +// .maxRows(100) .dataSource(dataSource) .build(); } From 1a35c0cd755fef333f427adfa1de78abbcb3d429 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:03:44 +0900 Subject: [PATCH 071/135] spirng batch --- ...JdbcCursorConfiguration.java => JpaCursorConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JdbcCursorConfiguration.java => JpaCursorConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java index 83bec46..44e913d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcCursorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java @@ -27,7 +27,7 @@ @RequiredArgsConstructor @Configuration -public class JdbcCursorConfiguration { +public class JpaCursorConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From d43ef26a2629af6ebc3caad2d605c6cb80b19054 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:08:51 +0900 Subject: [PATCH 072/135] spirng batch --- pom.xml | 4 +++ .../springbatchlecture/Customer.java | 11 ++++++-- .../JpaCursorConfiguration.java | 28 +++++++++++-------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 5a471be..7445dab 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,10 @@ org.springframework.boot spring-boot-starter-batch + + org.springframework.boot + spring-boot-starter-data-jpa + mysql mysql-connector-java diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index 6080e08..fb87f4d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -5,16 +5,21 @@ import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; import java.util.Date; @Data @NoArgsConstructor @AllArgsConstructor +@Entity public class Customer { + @Id + @GeneratedValue private Long Id; - private String firstName; - private String lastName; + private String firstname; + private String lastname; private String birthdate; - } \ No newline at end of file diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java index 44e913d..067b4b9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java @@ -7,7 +7,9 @@ import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.database.JdbcCursorItemReader; +import org.springframework.batch.item.database.JpaCursorItemReader; import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; +import org.springframework.batch.item.database.builder.JpaCursorItemReaderBuilder; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; @@ -19,6 +21,7 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.oxm.xstream.XStreamMarshaller; +import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.sql.Types; import java.util.Date; @@ -31,7 +34,7 @@ public class JpaCursorConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final DataSource dataSource; + private final EntityManagerFactory entityManagerFactory; @Bean public Job job() { @@ -51,17 +54,18 @@ public Step step1() { } @Bean - public JdbcCursorItemReader customItemReader() { - return new JdbcCursorItemReaderBuilder() - .name("jdbcCursorItemReader") - .fetchSize(10) - .sql("select id, firstName, lastName, birthdate from customer where firstName like ? order by lastName, firstName") - .beanRowMapper(Customer.class) - .queryArguments(new String[]{"A%"}, new int[]{Types.VARCHAR}) -// .maxItemCount(20) -// .currentItemCount(5) -// .maxRows(100) - .dataSource(dataSource) + public JpaCursorItemReader customItemReader() { + + HashMap parameters = new HashMap<>(); + parameters.put("firstname", "A%"); + + return new JpaCursorItemReaderBuilder() + .name("jpaCursorItemReader") + .queryString("select c from Customer c where firstname like :firstname") + .entityManagerFactory(entityManagerFactory) + .parameterValues(parameters) +// .maxItemCount(10) +// .currentItemCount(2) .build(); } From dad450d5b845a3e2294715c23420a324964254a7 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:32:31 +0900 Subject: [PATCH 073/135] spirng batch --- ...tion.java => JdbcPagingConfiguration.java} | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{JpaCursorConfiguration.java => JdbcPagingConfiguration.java} (59%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java similarity index 59% rename from src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java index 067b4b9..39f7a99 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaCursorConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java @@ -6,10 +6,11 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.item.database.JdbcCursorItemReader; -import org.springframework.batch.item.database.JpaCursorItemReader; +import org.springframework.batch.item.database.*; import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; +import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder; import org.springframework.batch.item.database.builder.JpaCursorItemReaderBuilder; +import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; @@ -19,6 +20,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.oxm.xstream.XStreamMarshaller; import javax.persistence.EntityManagerFactory; @@ -30,14 +32,14 @@ @RequiredArgsConstructor @Configuration -public class JpaCursorConfiguration { +public class JdbcPagingConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final EntityManagerFactory entityManagerFactory; + public final DataSource dataSource; @Bean - public Job job() { + public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) .start(step1()) @@ -45,7 +47,7 @@ public Job job() { } @Bean - public Step step1() { + public Step step1() throws Exception { return stepBuilderFactory.get("step1") .chunk(3) .reader(customItemReader()) @@ -54,21 +56,38 @@ public Step step1() { } @Bean - public JpaCursorItemReader customItemReader() { + public JdbcPagingItemReader customItemReader() throws Exception { HashMap parameters = new HashMap<>(); parameters.put("firstname", "A%"); - return new JpaCursorItemReaderBuilder() - .name("jpaCursorItemReader") - .queryString("select c from Customer c where firstname like :firstname") - .entityManagerFactory(entityManagerFactory) - .parameterValues(parameters) -// .maxItemCount(10) -// .currentItemCount(2) + return new JdbcPagingItemReaderBuilder() + .name("jdbcPagingItemReader") + .pageSize(10) + .fetchSize(10) + .dataSource(dataSource) + .rowMapper(new BeanPropertyRowMapper<>(Customer.class)) + .queryProvider(createQueryProvider()) + .parameterValues(parameters) .build(); } + @Bean + public PagingQueryProvider createQueryProvider() throws Exception { + SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean(); + queryProvider.setDataSource(dataSource); // Database에 맞는 PagingQueryProvider를 선택하기 위해 + queryProvider.setSelectClause("id, firstName, lastName, birthdate"); + queryProvider.setFromClause("from customer"); + queryProvider.setWhereClause("where firstname like :firstname"); + + Map sortKeys = new HashMap<>(1); + sortKeys.put("id", Order.ASCENDING); + + queryProvider.setSortKeys(sortKeys); + + return queryProvider.getObject(); + } + @Bean public ItemWriter customItemWriter() { return items -> { From a4dca79d0dfe202f3a91f16a27ca9b3c6c4a2f6d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:35:37 +0900 Subject: [PATCH 074/135] spirng batch --- ...JdbcPagingConfiguration.java => JpaPagingConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JdbcPagingConfiguration.java => JpaPagingConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java index 39f7a99..88fef7d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcPagingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java @@ -32,7 +32,7 @@ @RequiredArgsConstructor @Configuration -public class JdbcPagingConfiguration { +public class JpaPagingConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From fd341153fa0933fbf51709e1087d9d1b937bc7c2 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 16:57:45 +0900 Subject: [PATCH 075/135] spirng batch --- .../JpaPagingConfiguration.java | 39 +++++-------------- 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java index 88fef7d..4554cb6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java @@ -10,6 +10,7 @@ import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder; import org.springframework.batch.item.database.builder.JpaCursorItemReaderBuilder; +import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder; import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; @@ -17,6 +18,7 @@ import org.springframework.batch.item.xml.StaxEventItemReader; import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.CustomAutowireConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @@ -36,7 +38,7 @@ public class JpaPagingConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - public final DataSource dataSource; + private final EntityManagerFactory entityManagerFactory; @Bean public Job job() throws Exception { @@ -49,45 +51,22 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(3) + .chunk(10) .reader(customItemReader()) .writer(customItemWriter()) .build(); } @Bean - public JdbcPagingItemReader customItemReader() throws Exception { - - HashMap parameters = new HashMap<>(); - parameters.put("firstname", "A%"); - - return new JdbcPagingItemReaderBuilder() - .name("jdbcPagingItemReader") + public JpaPagingItemReader customItemReader() { + return new JpaPagingItemReaderBuilder() + .name("jpaPagingItemReader") + .entityManagerFactory(entityManagerFactory) .pageSize(10) - .fetchSize(10) - .dataSource(dataSource) - .rowMapper(new BeanPropertyRowMapper<>(Customer.class)) - .queryProvider(createQueryProvider()) - .parameterValues(parameters) + .queryString("SELECT p FROM Pay p WHERE amount >= 2000") .build(); } - @Bean - public PagingQueryProvider createQueryProvider() throws Exception { - SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean(); - queryProvider.setDataSource(dataSource); // Database에 맞는 PagingQueryProvider를 선택하기 위해 - queryProvider.setSelectClause("id, firstName, lastName, birthdate"); - queryProvider.setFromClause("from customer"); - queryProvider.setWhereClause("where firstname like :firstname"); - - Map sortKeys = new HashMap<>(1); - sortKeys.put("id", Order.ASCENDING); - - queryProvider.setSortKeys(sortKeys); - - return queryProvider.getObject(); - } - @Bean public ItemWriter customItemWriter() { return items -> { From 3d463b1595aa0d141399c832d3e03a3ec448dc5b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:01:24 +0900 Subject: [PATCH 076/135] spirng batch --- .../springbatchlecture/JpaPagingConfiguration.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java index 4554cb6..9a22ccb 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java @@ -59,11 +59,16 @@ public Step step1() throws Exception { @Bean public JpaPagingItemReader customItemReader() { + + HashMap parameters = new HashMap<>(); + parameters.put("firstname", "A%"); + return new JpaPagingItemReaderBuilder() .name("jpaPagingItemReader") .entityManagerFactory(entityManagerFactory) .pageSize(10) - .queryString("SELECT p FROM Pay p WHERE amount >= 2000") + .queryString("select c from Customer c where firstname like :firstname") + .parameterValues(parameters) .build(); } From af3c9a79974d83e70e12367196f6b2869155c47b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:07:41 +0900 Subject: [PATCH 077/135] spirng batch --- ...ngConfiguration.java => ItemReaderAdapterConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JpaPagingConfiguration.java => ItemReaderAdapterConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java index 9a22ccb..2e96bda 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaPagingConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java @@ -34,7 +34,7 @@ @RequiredArgsConstructor @Configuration -public class JpaPagingConfiguration { +public class ItemReaderAdapterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From b4185a103087bfa6f7389a2dc53739442f03869f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:13:54 +0900 Subject: [PATCH 078/135] spirng batch --- .../springbatchlecture/CustomService.java | 8 ++++++++ .../springbatchlecture/Customer.java | 3 --- .../ItemReaderAdapterConfiguration.java | 20 +++++++++---------- 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomService.java diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java new file mode 100644 index 0000000..0f9219e --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomService.java @@ -0,0 +1,8 @@ +package io.springbatch.springbatchlecture; + +public class CustomService { + + public void joinCustomer(){ + System.out.println("joined"); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index fb87f4d..f364bf2 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -13,11 +13,8 @@ @Data @NoArgsConstructor @AllArgsConstructor -@Entity public class Customer { - @Id - @GeneratedValue private Long Id; private String firstname; private String lastname; diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java index 2e96bda..63c0d2b 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java @@ -6,6 +6,7 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.adapter.ItemReaderAdapter; import org.springframework.batch.item.database.*; import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder; @@ -58,18 +59,17 @@ public Step step1() throws Exception { } @Bean - public JpaPagingItemReader customItemReader() { + public ItemReaderAdapter customItemReader() { - HashMap parameters = new HashMap<>(); - parameters.put("firstname", "A%"); + ItemReaderAdapter reader = new ItemReaderAdapter(); + reader.setTargetObject(customService()); + reader.setTargetMethod("joinCustomer"); - return new JpaPagingItemReaderBuilder() - .name("jpaPagingItemReader") - .entityManagerFactory(entityManagerFactory) - .pageSize(10) - .queryString("select c from Customer c where firstname like :firstname") - .parameterValues(parameters) - .build(); + return reader; + } + + private CustomService customService() { + return new CustomService(); } @Bean From 39f6e828f50f36fbc09906f294b4cdb43c4a836b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:16:05 +0900 Subject: [PATCH 079/135] spirng batch --- .../springbatchlecture/Customer.java | 22 ------------------- .../ItemReaderAdapterConfiguration.java | 8 +++---- 2 files changed, 3 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java deleted file mode 100644 index f364bf2..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import java.util.Date; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class Customer { - - private Long Id; - private String firstname; - private String lastname; - private String birthdate; -} \ No newline at end of file diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java index 63c0d2b..45ea96c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java @@ -52,7 +52,7 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) + .chunk(10) .reader(customItemReader()) .writer(customItemWriter()) .build(); @@ -73,11 +73,9 @@ private CustomService customService() { } @Bean - public ItemWriter customItemWriter() { + public ItemWriter customItemWriter() { return items -> { - for (Customer item : items) { - System.out.println(item.toString()); - } + System.out.println(items); }; } } From e5ddf20416c69764c755396d4ed3f46dfd8ba47e Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:17:48 +0900 Subject: [PATCH 080/135] spirng batch --- .../java/io/springbatch/springbatchlecture/CustomService.java | 2 +- .../springbatchlecture/ItemReaderAdapterConfiguration.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java index 0f9219e..81d1f55 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CustomService.java +++ b/src/main/java/io/springbatch/springbatchlecture/CustomService.java @@ -3,6 +3,6 @@ public class CustomService { public void joinCustomer(){ - System.out.println("joined"); + System.out.println(">> customer is joined"); } } diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java index 45ea96c..374ca77 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java @@ -39,7 +39,6 @@ public class ItemReaderAdapterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final EntityManagerFactory entityManagerFactory; @Bean public Job job() throws Exception { From bfe09f858e5031275e08788b8a7bfb5d50dab7f5 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:18:34 +0900 Subject: [PATCH 081/135] spirng batch --- .../java/io/springbatch/springbatchlecture/CustomService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java index 81d1f55..db184ae 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CustomService.java +++ b/src/main/java/io/springbatch/springbatchlecture/CustomService.java @@ -3,6 +3,6 @@ public class CustomService { public void joinCustomer(){ - System.out.println(">> customer is joined"); + System.out.println(">> Customer is joined"); } } From 4cbc828ec5ff23066b01641d4207119646957882 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 17:26:07 +0900 Subject: [PATCH 082/135] spirng batch --- ...derAdapterConfiguration.java => FlatFilesConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ItemReaderAdapterConfiguration.java => FlatFilesConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index 374ca77..5dca00e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ItemReaderAdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -35,7 +35,7 @@ @RequiredArgsConstructor @Configuration -public class ItemReaderAdapterConfiguration { +public class FlatFilesConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From de13fda92a050e7a5b1e69d47259a74ddd1b0a7b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 18:28:51 +0900 Subject: [PATCH 083/135] spirng batch --- .../springbatchlecture/CustomItemReader.java | 25 +++++++++++++++++++ .../springbatchlecture/CustomService.java | 8 ------ .../springbatchlecture/Customer.java | 15 +++++++++++ .../FlatFilesConfiguration.java | 17 +++++-------- 4 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomService.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java new file mode 100644 index 0000000..688a37a --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java @@ -0,0 +1,25 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.NonTransientResourceException; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.UnexpectedInputException; + +import java.util.List; + +public class CustomItemReader implements ItemReader { + + List items; + + public CustomItemReader(List items) { + this.items = items; + } + + public T read() throws Exception, UnexpectedInputException, NonTransientResourceException, ParseException { + + if (!items.isEmpty()) { + return items.remove(0); + } + return null; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java deleted file mode 100644 index db184ae..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomService.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.springbatch.springbatchlecture; - -public class CustomService { - - public void joinCustomer(){ - System.out.println(">> Customer is joined"); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java new file mode 100644 index 0000000..65a1aba --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -0,0 +1,15 @@ + +package io.springbatch.springbatchlecture; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Customer { + + private long id; + private String name; + private int age; + +} diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index 5dca00e..85ae73e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -29,9 +29,7 @@ import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.sql.Types; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @RequiredArgsConstructor @Configuration @@ -58,19 +56,16 @@ public Step step1() throws Exception { } @Bean - public ItemReaderAdapter customItemReader() { + public CustomItemReader customItemReader() { - ItemReaderAdapter reader = new ItemReaderAdapter(); - reader.setTargetObject(customService()); - reader.setTargetMethod("joinCustomer"); + List customers = Arrays.asList(new Customer(1, "hong gil dong1", 41), + new Customer(2, "hong gil dong2", 42), + new Customer(3, "hong gil dong3", 43)); + CustomItemReader reader = new CustomItemReader(customers); return reader; } - private CustomService customService() { - return new CustomService(); - } - @Bean public ItemWriter customItemWriter() { return items -> { From 79c1d7968f89ce5bd8900aeb6783f185d4660f7a Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 18:35:14 +0900 Subject: [PATCH 084/135] spirng batch --- .../FlatFilesConfiguration.java | 15 +++++++++++---- src/main/resources/customer.json | 17 ----------------- 2 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 src/main/resources/customer.json diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index 85ae73e..a861728 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -13,6 +13,8 @@ import org.springframework.batch.item.database.builder.JpaCursorItemReaderBuilder; import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder; import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; +import org.springframework.batch.item.file.FlatFileItemWriter; +import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; @@ -23,6 +25,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.FileSystemResource; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.oxm.xstream.XStreamMarshaller; @@ -67,10 +70,14 @@ public CustomItemReader customItemReader() { } @Bean - public ItemWriter customItemWriter() { - return items -> { - System.out.println(items); - }; + public FlatFileItemWriter customItemWriter() throws Exception { + return new FlatFileItemWriterBuilder() + .name("customerWriter") + .resource(new ClassPathResource("customer.csv")) + .delimited() + .delimiter("|") + .names(new String[] {"id", "name", "age"}) + .build(); } } diff --git a/src/main/resources/customer.json b/src/main/resources/customer.json deleted file mode 100644 index 1ea4379..0000000 --- a/src/main/resources/customer.json +++ /dev/null @@ -1,17 +0,0 @@ -[ - { - "id" : 1, - "name" : "hong gil dong1", - "age" : 41 - }, - { - "id" : 2, - "name" : "hong gil dong2", - "age" : 42 - }, - { - "id" : 3, - "name" : "hong gil dong3", - "age" : 43 - } -] \ No newline at end of file From b26c4413c8d9505ec9ebc1ef2c278176a66df2d6 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 19:05:51 +0900 Subject: [PATCH 085/135] spirng batch --- .../springbatchlecture/CustomItemReader.java | 25 ----------------- .../FlatFilesConfiguration.java | 28 +++++++++++++++++-- src/main/resources/customer.csv | 0 3 files changed, 25 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java create mode 100644 src/main/resources/customer.csv diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java deleted file mode 100644 index 688a37a..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemReader.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.NonTransientResourceException; -import org.springframework.batch.item.ParseException; -import org.springframework.batch.item.UnexpectedInputException; - -import java.util.List; - -public class CustomItemReader implements ItemReader { - - List items; - - public CustomItemReader(List items) { - this.items = items; - } - - public T read() throws Exception, UnexpectedInputException, NonTransientResourceException, ParseException { - - if (!items.isEmpty()) { - return items.remove(0); - } - return null; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java index a861728..87c489a 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java @@ -15,9 +15,12 @@ import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; import org.springframework.batch.item.file.FlatFileItemWriter; import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder; +import org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor; +import org.springframework.batch.item.file.transform.DelimitedLineAggregator; import org.springframework.batch.item.json.JacksonJsonObjectReader; import org.springframework.batch.item.json.JsonItemReader; import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; +import org.springframework.batch.item.support.ListItemReader; import org.springframework.batch.item.xml.StaxEventItemReader; import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +29,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.oxm.xstream.XStreamMarshaller; @@ -59,23 +63,41 @@ public Step step1() throws Exception { } @Bean - public CustomItemReader customItemReader() { + public ListItemReader customItemReader() { List customers = Arrays.asList(new Customer(1, "hong gil dong1", 41), new Customer(2, "hong gil dong2", 42), new Customer(3, "hong gil dong3", 43)); - CustomItemReader reader = new CustomItemReader(customers); + ListItemReader reader = new ListItemReader<>(customers); return reader; } + /*@Bean + public FlatFileItemWriter customItemWriter() throws Exception { + + BeanWrapperFieldExtractor fieldExtractor = new BeanWrapperFieldExtractor<>(); + fieldExtractor.setNames(new String[] {"id","name","age"}); + fieldExtractor.afterPropertiesSet(); + + DelimitedLineAggregator lineAggregator = new DelimitedLineAggregator<>(); + lineAggregator.setDelimiter(","); + lineAggregator.setFieldExtractor(fieldExtractor); + + return new FlatFileItemWriterBuilder() + .name("CustomerWriter") + .resource(new ClassPathResource("customer.csv")) + .lineAggregator(lineAggregator) + .build(); + }*/ + @Bean public FlatFileItemWriter customItemWriter() throws Exception { return new FlatFileItemWriterBuilder() .name("customerWriter") .resource(new ClassPathResource("customer.csv")) .delimited() - .delimiter("|") + .delimiter(",") .names(new String[] {"id", "name", "age"}) .build(); } diff --git a/src/main/resources/customer.csv b/src/main/resources/customer.csv new file mode 100644 index 0000000..e69de29 From 85fab5cd76db406f974dbf0671d73b340627b7ae Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 19:07:37 +0900 Subject: [PATCH 086/135] spirng batch --- ...sConfiguration.java => FlatFilesFormattedConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{FlatFilesConfiguration.java => FlatFilesFormattedConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java index 87c489a..67ddc08 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java @@ -40,7 +40,7 @@ @RequiredArgsConstructor @Configuration -public class FlatFilesConfiguration { +public class FlatFilesFormattedConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 63d3a5b26ba4884f4b147842fcffdca72cbc40d7 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 19:19:18 +0900 Subject: [PATCH 087/135] spirng batch --- .../FlatFilesFormattedConfiguration.java | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java index 67ddc08..39129c9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java @@ -73,31 +73,13 @@ public ListItemReader customItemReader() { return reader; } - /*@Bean - public FlatFileItemWriter customItemWriter() throws Exception { - - BeanWrapperFieldExtractor fieldExtractor = new BeanWrapperFieldExtractor<>(); - fieldExtractor.setNames(new String[] {"id","name","age"}); - fieldExtractor.afterPropertiesSet(); - - DelimitedLineAggregator lineAggregator = new DelimitedLineAggregator<>(); - lineAggregator.setDelimiter(","); - lineAggregator.setFieldExtractor(fieldExtractor); - - return new FlatFileItemWriterBuilder() - .name("CustomerWriter") - .resource(new ClassPathResource("customer.csv")) - .lineAggregator(lineAggregator) - .build(); - }*/ - @Bean public FlatFileItemWriter customItemWriter() throws Exception { return new FlatFileItemWriterBuilder() .name("customerWriter") .resource(new ClassPathResource("customer.csv")) - .delimited() - .delimiter(",") + .formatted() + .format("%-2s%-15s%-2d") .names(new String[] {"id", "name", "age"}) .build(); } From 9762c2e5ca57dbd936b3d05597b386d3cda80482 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 23 Jun 2021 19:20:29 +0900 Subject: [PATCH 088/135] spirng batch --- ...atFilesFormattedConfiguration.java => XMLConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{FlatFilesFormattedConfiguration.java => XMLConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index 39129c9..6465e6d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FlatFilesFormattedConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -40,7 +40,7 @@ @RequiredArgsConstructor @Configuration -public class FlatFilesFormattedConfiguration { +public class XMLConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From ec67a09c5ded6b67b990fa7075dd37e044cba127 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 10:33:53 +0900 Subject: [PATCH 089/135] spirng batch --- .../springbatchlecture/Customer.java | 9 +- .../springbatchlecture/CustomerRowMapper.java | 16 ++++ .../springbatchlecture/XMLConfiguration.java | 86 +++++++++++-------- .../resources/{customer.csv => customer.xml} | 0 4 files changed, 72 insertions(+), 39 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java rename src/main/resources/{customer.csv => customer.xml} (100%) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index 65a1aba..9c60ce4 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -4,12 +4,15 @@ import lombok.AllArgsConstructor; import lombok.Data; +import java.util.Date; + @Data @AllArgsConstructor public class Customer { - private long id; - private String name; - private int age; + private final long id; + private final String firstName; + private final String lastName; + private final Date birthdate; } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java b/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java new file mode 100644 index 0000000..fe34382 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java @@ -0,0 +1,16 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CustomerRowMapper implements RowMapper { + @Override + public Customer mapRow(ResultSet rs, int i) throws SQLException { + return new Customer(rs.getLong("id"), + rs.getString("firstName"), + rs.getString("lastName"), + rs.getDate("birthdate")); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java index 6465e6d..81ea6bb 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java @@ -5,37 +5,17 @@ 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.ItemWriter; -import org.springframework.batch.item.adapter.ItemReaderAdapter; import org.springframework.batch.item.database.*; -import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder; -import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder; -import org.springframework.batch.item.database.builder.JpaCursorItemReaderBuilder; -import org.springframework.batch.item.database.builder.JpaPagingItemReaderBuilder; -import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; -import org.springframework.batch.item.file.FlatFileItemWriter; -import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder; -import org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor; -import org.springframework.batch.item.file.transform.DelimitedLineAggregator; -import org.springframework.batch.item.json.JacksonJsonObjectReader; -import org.springframework.batch.item.json.JsonItemReader; -import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; -import org.springframework.batch.item.support.ListItemReader; -import org.springframework.batch.item.xml.StaxEventItemReader; -import org.springframework.batch.item.xml.builder.StaxEventItemReaderBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.CustomAutowireConfigurer; +import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; +import org.springframework.batch.item.xml.StaxEventItemWriter; +import org.springframework.batch.item.xml.builder.StaxEventItemWriterBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.oxm.xstream.XStreamMarshaller; -import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; -import java.sql.Types; import java.util.*; @RequiredArgsConstructor @@ -44,6 +24,7 @@ public class XMLConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final DataSource dataSource; @Bean public Job job() throws Exception { @@ -56,32 +37,65 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) + .chunk(10) .reader(customItemReader()) .writer(customItemWriter()) .build(); } @Bean - public ListItemReader customItemReader() { + public JdbcPagingItemReader customItemReader() { - List customers = Arrays.asList(new Customer(1, "hong gil dong1", 41), - new Customer(2, "hong gil dong2", 42), - new Customer(3, "hong gil dong3", 43)); + JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); + + reader.setDataSource(this.dataSource); + reader.setFetchSize(10); + reader.setRowMapper(new CustomerRowMapper()); + + MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); + queryProvider.setSelectClause("id, firstName, lastName, birthdate"); + queryProvider.setFromClause("from customer"); + queryProvider.setWhereClause("where firstname like :firstname"); + + Map sortKeys = new HashMap<>(1); + + sortKeys.put("id", Order.ASCENDING); + queryProvider.setSortKeys(sortKeys); + reader.setQueryProvider(queryProvider); + + HashMap parameters = new HashMap<>(); + parameters.put("firstname", "A%"); + + reader.setParameterValues(parameters); - ListItemReader reader = new ListItemReader<>(customers); return reader; } @Bean - public FlatFileItemWriter customItemWriter() throws Exception { - return new FlatFileItemWriterBuilder() - .name("customerWriter") - .resource(new ClassPathResource("customer.csv")) - .formatted() - .format("%-2s%-15s%-2d") - .names(new String[] {"id", "name", "age"}) + public StaxEventItemWriter customItemWriter() { + return new StaxEventItemWriterBuilder() + .name("customersWriter") + .marshaller(itemMarshaller()) + .resource(new ClassPathResource("customer.xml")) + .rootTagName("customer") + .overwriteOutput(true) .build(); + + } + + @Bean + public XStreamMarshaller itemMarshaller() { + Map> aliases = new HashMap<>(); + aliases.put("customer", Customer.class); + aliases.put("id", Long.class); + aliases.put("firstName", String.class); + aliases.put("lastName", String.class); + aliases.put("birthdate", Date.class); + XStreamMarshaller xStreamMarshaller = new XStreamMarshaller(); + xStreamMarshaller.setAliases(aliases); + return xStreamMarshaller; } + + } diff --git a/src/main/resources/customer.csv b/src/main/resources/customer.xml similarity index 100% rename from src/main/resources/customer.csv rename to src/main/resources/customer.xml From 0278a1b32248b2abd0c4b75181c8819aba6c1b00 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 10:44:08 +0900 Subject: [PATCH 090/135] spirng batch --- ...figuration.java => JsonConfiguration.java} | 33 +++++-------------- .../resources/{customer.xml => customer.json} | 0 2 files changed, 9 insertions(+), 24 deletions(-) rename src/main/java/io/springbatch/springbatchlecture/{XMLConfiguration.java => JsonConfiguration.java} (75%) rename src/main/resources/{customer.xml => customer.json} (100%) diff --git a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java similarity index 75% rename from src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java index 81ea6bb..2780d44 100644 --- a/src/main/java/io/springbatch/springbatchlecture/XMLConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java @@ -7,6 +7,9 @@ import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.database.*; import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; +import org.springframework.batch.item.json.JacksonJsonObjectMarshaller; +import org.springframework.batch.item.json.JsonFileItemWriter; +import org.springframework.batch.item.json.builder.JsonFileItemWriterBuilder; import org.springframework.batch.item.xml.StaxEventItemWriter; import org.springframework.batch.item.xml.builder.StaxEventItemWriterBuilder; import org.springframework.context.annotation.Bean; @@ -20,7 +23,7 @@ @RequiredArgsConstructor @Configuration -public class XMLConfiguration { +public class JsonConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -72,30 +75,12 @@ public JdbcPagingItemReader customItemReader() { } @Bean - public StaxEventItemWriter customItemWriter() { - return new StaxEventItemWriterBuilder() - .name("customersWriter") - .marshaller(itemMarshaller()) - .resource(new ClassPathResource("customer.xml")) - .rootTagName("customer") - .overwriteOutput(true) + public JsonFileItemWriter customItemWriter() { + return new JsonFileItemWriterBuilder() + .jsonObjectMarshaller(new JacksonJsonObjectMarshaller<>()) + .resource(new ClassPathResource("customer.json")) + .name("customerJsonFileItemWriter") .build(); - - } - - @Bean - public XStreamMarshaller itemMarshaller() { - Map> aliases = new HashMap<>(); - aliases.put("customer", Customer.class); - aliases.put("id", Long.class); - aliases.put("firstName", String.class); - aliases.put("lastName", String.class); - aliases.put("birthdate", Date.class); - XStreamMarshaller xStreamMarshaller = new XStreamMarshaller(); - xStreamMarshaller.setAliases(aliases); - return xStreamMarshaller; } - - } diff --git a/src/main/resources/customer.xml b/src/main/resources/customer.json similarity index 100% rename from src/main/resources/customer.xml rename to src/main/resources/customer.json From 8dbd88dd35fcb18d4fd61ec1ca98561251b5b772 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:22:59 +0900 Subject: [PATCH 091/135] spirng batch --- src/main/java/io/springbatch/springbatchlecture/Customer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index 9c60ce4..d1559d6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -14,5 +14,4 @@ public class Customer { private final String firstName; private final String lastName; private final Date birthdate; - } From cd5bc89644563a4ac6dc8ba415af2464c1e1da2a Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:23:25 +0900 Subject: [PATCH 092/135] spirng batch --- src/main/java/io/springbatch/springbatchlecture/Customer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index d1559d6..bd6e991 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -14,4 +14,4 @@ public class Customer { private final String firstName; private final String lastName; private final Date birthdate; -} +} \ No newline at end of file From ded740be9e7fc586cf0645522acffe8e0eb865e8 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:25:48 +0900 Subject: [PATCH 093/135] spirng batch --- src/main/java/io/springbatch/springbatchlecture/Customer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index bd6e991..d1559d6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -14,4 +14,4 @@ public class Customer { private final String firstName; private final String lastName; private final Date birthdate; -} \ No newline at end of file +} From c70341a1ce08badbf9d3a2cfccc1b152ce5e5347 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:26:10 +0900 Subject: [PATCH 094/135] spirng batch --- src/main/java/io/springbatch/springbatchlecture/Customer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index d1559d6..bd6e991 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -14,4 +14,4 @@ public class Customer { private final String firstName; private final String lastName; private final Date birthdate; -} +} \ No newline at end of file From c206565ff9a94544a771f39a58a082cef3532d19 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:26:38 +0900 Subject: [PATCH 095/135] spirng batch --- src/main/java/io/springbatch/springbatchlecture/Customer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index bd6e991..d1559d6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -14,4 +14,4 @@ public class Customer { private final String firstName; private final String lastName; private final Date birthdate; -} \ No newline at end of file +} From 3db1a4a4bd7ca7bc91ecfea758c533fd08c88f96 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 11:28:25 +0900 Subject: [PATCH 096/135] spirng batch --- .../{JsonConfiguration.java => JdbcBatchConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JsonConfiguration.java => JdbcBatchConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java index 2780d44..78e909e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JsonConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java @@ -23,7 +23,7 @@ @RequiredArgsConstructor @Configuration -public class JsonConfiguration { +public class JdbcBatchConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 8c4bd5abd09e722ef46ab1a87db898eebeac9d44 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 13:25:12 +0900 Subject: [PATCH 097/135] spirng batch --- .../JdbcBatchConfiguration.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java index 78e909e..42886ab 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java @@ -6,6 +6,7 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.database.*; +import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; import org.springframework.batch.item.json.JacksonJsonObjectMarshaller; import org.springframework.batch.item.json.JsonFileItemWriter; @@ -75,12 +76,24 @@ public JdbcPagingItemReader customItemReader() { } @Bean - public JsonFileItemWriter customItemWriter() { - return new JsonFileItemWriterBuilder() - .jsonObjectMarshaller(new JacksonJsonObjectMarshaller<>()) - .resource(new ClassPathResource("customer.json")) - .name("customerJsonFileItemWriter") + public JdbcBatchItemWriter customItemWriter() { + return new JdbcBatchItemWriterBuilder() + .dataSource(dataSource) + .sql("insert into customer2 values (:id, :firstName, :lastName, :birthdate)") + .beanMapped() .build(); } + + /*@Bean + public JdbcBatchItemWriter customItemWriter() { + JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); + + itemWriter.setDataSource(this.dataSource); + itemWriter.setSql("insert into customer2 values (:id, :firstName, :lastName, :birthdate)"); + itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + itemWriter.afterPropertiesSet(); + + return itemWriter; + }*/ } From 37f1aa3a801e73b7c13a4ebaaedb6943623f8f4a Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 13:26:25 +0900 Subject: [PATCH 098/135] spirng batch --- .../{JdbcBatchConfiguration.java => JpaConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JdbcBatchConfiguration.java => JpaConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java index 42886ab..7bacb61 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JdbcBatchConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java @@ -24,7 +24,7 @@ @RequiredArgsConstructor @Configuration -public class JdbcBatchConfiguration { +public class JpaConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From b7500d455ebc3700da68ea6891a81c6d4f121b7f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 13:46:43 +0900 Subject: [PATCH 099/135] spirng batch --- .../springbatchlecture/Customer.java | 22 +++++++++++----- .../springbatchlecture/JpaConfiguration.java | 26 ++++++------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java index d1559d6..1175cbd 100644 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -2,16 +2,26 @@ package io.springbatch.springbatchlecture; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; import java.util.Date; -@Data +@Getter +@Setter @AllArgsConstructor +@NoArgsConstructor +@Table(name = "customer2") +@Entity public class Customer { - private final long id; - private final String firstName; - private final String lastName; - private final Date birthdate; + @Id + private long id; + private String firstname; + private String lastname; + private Date birthdate; } diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java index 7bacb61..bb7b3cc 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java @@ -7,6 +7,7 @@ import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.database.*; import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; +import org.springframework.batch.item.database.builder.JpaItemWriterBuilder; import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; import org.springframework.batch.item.json.JacksonJsonObjectMarshaller; import org.springframework.batch.item.json.JsonFileItemWriter; @@ -19,6 +20,7 @@ import org.springframework.core.io.FileSystemResource; import org.springframework.oxm.xstream.XStreamMarshaller; +import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.*; @@ -29,6 +31,7 @@ public class JpaConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final DataSource dataSource; + private final EntityManagerFactory entityManagerFactory; @Bean public Job job() throws Exception { @@ -68,7 +71,7 @@ public JdbcPagingItemReader customItemReader() { reader.setQueryProvider(queryProvider); HashMap parameters = new HashMap<>(); - parameters.put("firstname", "A%"); + parameters.put("firstname", "C%"); reader.setParameterValues(parameters); @@ -76,24 +79,11 @@ public JdbcPagingItemReader customItemReader() { } @Bean - public JdbcBatchItemWriter customItemWriter() { - return new JdbcBatchItemWriterBuilder() - .dataSource(dataSource) - .sql("insert into customer2 values (:id, :firstName, :lastName, :birthdate)") - .beanMapped() + public JpaItemWriter customItemWriter() { + return new JpaItemWriterBuilder() + .entityManagerFactory(entityManagerFactory) + .usePersist(true) .build(); } - - /*@Bean - public JdbcBatchItemWriter customItemWriter() { - JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); - - itemWriter.setDataSource(this.dataSource); - itemWriter.setSql("insert into customer2 values (:id, :firstName, :lastName, :birthdate)"); - itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - itemWriter.afterPropertiesSet(); - - return itemWriter; - }*/ } From 05744d7d5427efae708790b8ffc9a57e192d4556 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 13:47:47 +0900 Subject: [PATCH 100/135] spirng batch --- .../{JpaConfiguration.java => AdapterConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{JpaConfiguration.java => AdapterConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java index bb7b3cc..d136ceb 100644 --- a/src/main/java/io/springbatch/springbatchlecture/JpaConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java @@ -26,7 +26,7 @@ @RequiredArgsConstructor @Configuration -public class JpaConfiguration { +public class AdapterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From b74444ce7f5785ca532a1ef467ef0d889490781b Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 14:00:47 +0900 Subject: [PATCH 101/135] spirng batch --- .../AdapterConfiguration.java | 53 ++++++++----------- .../springbatchlecture/CustomService.java | 8 +++ .../springbatchlecture/Customer.java | 27 ---------- .../springbatchlecture/CustomerRowMapper.java | 16 ------ 4 files changed, 29 insertions(+), 75 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomService.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java diff --git a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java index d136ceb..03b7ed6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java @@ -5,6 +5,12 @@ 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.ItemReader; +import org.springframework.batch.item.NonTransientResourceException; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.UnexpectedInputException; +import org.springframework.batch.item.adapter.ItemReaderAdapter; +import org.springframework.batch.item.adapter.ItemWriterAdapter; import org.springframework.batch.item.database.*; import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; import org.springframework.batch.item.database.builder.JpaItemWriterBuilder; @@ -30,8 +36,6 @@ public class AdapterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; - private final DataSource dataSource; - private final EntityManagerFactory entityManagerFactory; @Bean public Job job() throws Exception { @@ -44,46 +48,31 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) - .reader(customItemReader()) + .chunk(10) + .reader(new ItemReader() { + @Override + public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { + return "item"; + } + }) .writer(customItemWriter()) .build(); } - @Bean - public JdbcPagingItemReader customItemReader() { - - JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); - - reader.setDataSource(this.dataSource); - reader.setFetchSize(10); - reader.setRowMapper(new CustomerRowMapper()); - - MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); - queryProvider.setSelectClause("id, firstName, lastName, birthdate"); - queryProvider.setFromClause("from customer"); - queryProvider.setWhereClause("where firstname like :firstname"); - Map sortKeys = new HashMap<>(1); - sortKeys.put("id", Order.ASCENDING); - queryProvider.setSortKeys(sortKeys); - reader.setQueryProvider(queryProvider); - - HashMap parameters = new HashMap<>(); - parameters.put("firstname", "C%"); - - reader.setParameterValues(parameters); + @Bean + public ItemWriterAdapter customItemWriter() { + ItemWriterAdapter writer = new ItemWriterAdapter(); + writer.setTargetObject(customService()); + writer.setTargetMethod("joinCustomer"); - return reader; + return writer; } @Bean - public JpaItemWriter customItemWriter() { - return new JpaItemWriterBuilder() - .entityManagerFactory(entityManagerFactory) - .usePersist(true) - .build(); + public CustomService customService() { + return new CustomService(); } } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java new file mode 100644 index 0000000..db184ae --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomService.java @@ -0,0 +1,8 @@ +package io.springbatch.springbatchlecture; + +public class CustomService { + + public void joinCustomer(){ + System.out.println(">> Customer is joined"); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java deleted file mode 100644 index 1175cbd..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/Customer.java +++ /dev/null @@ -1,27 +0,0 @@ - -package io.springbatch.springbatchlecture; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.util.Date; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Table(name = "customer2") -@Entity -public class Customer { - - @Id - private long id; - private String firstname; - private String lastname; - private Date birthdate; -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java b/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java deleted file mode 100644 index fe34382..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.jdbc.core.RowMapper; - -import java.sql.ResultSet; -import java.sql.SQLException; - -public class CustomerRowMapper implements RowMapper { - @Override - public Customer mapRow(ResultSet rs, int i) throws SQLException { - return new Customer(rs.getLong("id"), - rs.getString("firstName"), - rs.getString("lastName"), - rs.getDate("birthdate")); - } -} From 8c4c440de6bb4a5c500af675db20f35c9dd0f492 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 15:21:38 +0900 Subject: [PATCH 102/135] spirng batch --- .../AdapterConfiguration.java | 22 ++++--------------- .../springbatchlecture/CustomService.java | 1 + 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java index 03b7ed6..076d48b 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java @@ -9,26 +9,9 @@ import org.springframework.batch.item.NonTransientResourceException; import org.springframework.batch.item.ParseException; import org.springframework.batch.item.UnexpectedInputException; -import org.springframework.batch.item.adapter.ItemReaderAdapter; import org.springframework.batch.item.adapter.ItemWriterAdapter; -import org.springframework.batch.item.database.*; -import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; -import org.springframework.batch.item.database.builder.JpaItemWriterBuilder; -import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; -import org.springframework.batch.item.json.JacksonJsonObjectMarshaller; -import org.springframework.batch.item.json.JsonFileItemWriter; -import org.springframework.batch.item.json.builder.JsonFileItemWriterBuilder; -import org.springframework.batch.item.xml.StaxEventItemWriter; -import org.springframework.batch.item.xml.builder.StaxEventItemWriterBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.FileSystemResource; -import org.springframework.oxm.xstream.XStreamMarshaller; - -import javax.persistence.EntityManagerFactory; -import javax.sql.DataSource; -import java.util.*; @RequiredArgsConstructor @Configuration @@ -50,9 +33,11 @@ public Step step1() throws Exception { return stepBuilderFactory.get("step1") .chunk(10) .reader(new ItemReader() { + int i = 0; @Override public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { - return "item"; + i++; + return i > 10 ? null : "item"; } }) .writer(customItemWriter()) @@ -63,6 +48,7 @@ public String read() throws Exception, UnexpectedInputException, ParseException, @Bean public ItemWriterAdapter customItemWriter() { + ItemWriterAdapter writer = new ItemWriterAdapter(); writer.setTargetObject(customService()); writer.setTargetMethod("joinCustomer"); diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java index db184ae..30c1ba2 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CustomService.java +++ b/src/main/java/io/springbatch/springbatchlecture/CustomService.java @@ -6,3 +6,4 @@ public void joinCustomer(){ System.out.println(">> Customer is joined"); } } + From 9559f93f3a5ce5d29619692a90eccaa278360e21 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 15:24:28 +0900 Subject: [PATCH 103/135] spirng batch --- ...pterConfiguration.java => CompositionItemConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{AdapterConfiguration.java => CompositionItemConfiguration.java} (97%) diff --git a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java similarity index 97% rename from src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java index 076d48b..fbc2205 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AdapterConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java @@ -15,7 +15,7 @@ @RequiredArgsConstructor @Configuration -public class AdapterConfiguration { +public class CompositionItemConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 0a4f0c530e8f0a43fc0192333adb439b2500009d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 15:54:49 +0900 Subject: [PATCH 104/135] spirng batch --- .../CompositionItemConfiguration.java | 38 ++++++++++--------- .../CustomItemProcessor1.java | 14 +++++++ .../CustomItemProcessor2.java | 14 +++++++ .../springbatchlecture/CustomService.java | 9 ----- 4 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomService.java diff --git a/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java index fbc2205..38887f9 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java @@ -5,14 +5,16 @@ 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.ItemReader; -import org.springframework.batch.item.NonTransientResourceException; -import org.springframework.batch.item.ParseException; -import org.springframework.batch.item.UnexpectedInputException; +import org.springframework.batch.item.*; import org.springframework.batch.item.adapter.ItemWriterAdapter; +import org.springframework.batch.item.support.CompositeItemProcessor; +import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.ArrayList; +import java.util.List; + @RequiredArgsConstructor @Configuration public class CompositionItemConfiguration { @@ -40,25 +42,27 @@ public String read() throws Exception, UnexpectedInputException, ParseException, return i > 10 ? null : "item"; } }) - .writer(customItemWriter()) + .processor(customItemProcessor()) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { + System.out.println(items); + } + }) .build(); } - - @Bean - public ItemWriterAdapter customItemWriter() { - - ItemWriterAdapter writer = new ItemWriterAdapter(); - writer.setTargetObject(customService()); - writer.setTargetMethod("joinCustomer"); + public CompositeItemProcessor customItemProcessor() { - return writer; - } + CompositeItemProcessor compositeProcessor = new CompositeItemProcessor<>(); + List itemProcessors = new ArrayList(); + itemProcessors.add(new CustomItemProcessor1()); + itemProcessors.add(new CustomItemProcessor2()); - @Bean - public CustomService customService() { - return new CustomService(); + return new CompositeItemProcessorBuilder<>() + .delegates(itemProcessors) + .build(); } } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java new file mode 100644 index 0000000..c63cfda --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java @@ -0,0 +1,14 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; + +public class CustomItemProcessor1 implements ItemProcessor { + + int cnt = 0; + + @Override + public String process(String item) throws Exception { + cnt++; + return item + cnt; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java new file mode 100644 index 0000000..1558213 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java @@ -0,0 +1,14 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; + +public class CustomItemProcessor2 implements ItemProcessor { + + int cnt = 0; + + @Override + public String process(String item) throws Exception { + cnt++; + return item + cnt; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomService.java b/src/main/java/io/springbatch/springbatchlecture/CustomService.java deleted file mode 100644 index 30c1ba2..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomService.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.springbatch.springbatchlecture; - -public class CustomService { - - public void joinCustomer(){ - System.out.println(">> Customer is joined"); - } -} - From c5793aad648ea1994823194f15ca14a75a61e6f0 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 16:01:27 +0900 Subject: [PATCH 105/135] spirng batch --- ...itionItemConfiguration.java => ClassifierConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{CompositionItemConfiguration.java => ClassifierConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java index 38887f9..f51b3e2 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CompositionItemConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java @@ -17,7 +17,7 @@ @RequiredArgsConstructor @Configuration -public class CompositionItemConfiguration { +public class ClassifierConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From d6301c893e7db82559f4719e4747d5c4b7ff44b1 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 18:08:51 +0900 Subject: [PATCH 106/135] spirng batch --- .../ClassifierConfiguration.java | 36 +++++++++++-------- .../CustomItemProcessor1.java | 9 ++--- .../CustomItemProcessor2.java | 10 ++---- .../CustomItemProcessor3.java | 11 ++++++ .../ProcessorClassifier.java | 21 +++++++++++ .../springbatchlecture/ProcessorInfo.java | 11 ++++++ 6 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java diff --git a/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java index f51b3e2..899b4ed 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java @@ -7,13 +7,17 @@ import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.*; import org.springframework.batch.item.adapter.ItemWriterAdapter; +import org.springframework.batch.item.support.ClassifierCompositeItemProcessor; import org.springframework.batch.item.support.CompositeItemProcessor; import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder; +import org.springframework.classify.PatternMatchingClassifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @RequiredArgsConstructor @Configuration @@ -33,19 +37,20 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) - .reader(new ItemReader() { + .chunk(10) + .reader(new ItemReader() { int i = 0; @Override - public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { + public ProcessorInfo read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { i++; - return i > 10 ? null : "item"; + ProcessorInfo processorInfo = ProcessorInfo.builder().id(i).build(); + return i > 3 ? null : processorInfo; } }) .processor(customItemProcessor()) - .writer(new ItemWriter() { + .writer(new ItemWriter() { @Override - public void write(List items) throws Exception { + public void write(List items) throws Exception { System.out.println(items); } }) @@ -53,16 +58,19 @@ public void write(List items) throws Exception { } @Bean - public CompositeItemProcessor customItemProcessor() { + public ItemProcessor customItemProcessor() { - CompositeItemProcessor compositeProcessor = new CompositeItemProcessor<>(); - List itemProcessors = new ArrayList(); - itemProcessors.add(new CustomItemProcessor1()); - itemProcessors.add(new CustomItemProcessor2()); + ClassifierCompositeItemProcessor processor = new ClassifierCompositeItemProcessor(); - return new CompositeItemProcessorBuilder<>() - .delegates(itemProcessors) - .build(); + ProcessorClassifier classifier = new ProcessorClassifier<>(); + Map> processorMap = new HashMap<>(); + processorMap.put(1, new CustomItemProcessor1()); + processorMap.put(2, new CustomItemProcessor2()); + processorMap.put(3, new CustomItemProcessor3()); + classifier.setProcessorMap(processorMap); + processor.setClassifier(classifier); + + return processor; } } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java index c63cfda..befcbf8 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java @@ -2,13 +2,10 @@ import org.springframework.batch.item.ItemProcessor; -public class CustomItemProcessor1 implements ItemProcessor { - - int cnt = 0; +public class CustomItemProcessor1 implements ItemProcessor { @Override - public String process(String item) throws Exception { - cnt++; - return item + cnt; + public ProcessorInfo process(ProcessorInfo item) throws Exception { + return item; } } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java index 1558213..7290c74 100644 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java @@ -2,13 +2,9 @@ import org.springframework.batch.item.ItemProcessor; -public class CustomItemProcessor2 implements ItemProcessor { +public class CustomItemProcessor2 implements ItemProcessor { - int cnt = 0; - - @Override - public String process(String item) throws Exception { - cnt++; - return item + cnt; + public ProcessorInfo process(ProcessorInfo item) throws Exception { + return item; } } diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java new file mode 100644 index 0000000..783cd08 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java @@ -0,0 +1,11 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; + +public class CustomItemProcessor3 implements ItemProcessor { + + @Override + public ProcessorInfo process(ProcessorInfo item) throws Exception { + return item; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java b/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java new file mode 100644 index 0000000..53fc433 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java @@ -0,0 +1,21 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; +import org.springframework.classify.Classifier; + +import java.util.HashMap; +import java.util.Map; + +public class ProcessorClassifier implements Classifier { + + private Map> processorMap = new HashMap<>(); + + @Override + public T classify(ProcessorInfo classifiable) { + return (T) processorMap.get(classifiable.getId()); + } + + public void setProcessorMap(Map> processorMap) { + this.processorMap = processorMap; + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java b/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java new file mode 100644 index 0000000..87e1e4f --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java @@ -0,0 +1,11 @@ +package io.springbatch.springbatchlecture; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ProcessorInfo { + + private int id; +} From 18d64a5bdc5c688af2afa521cf653c8f2ac3a212 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 18:13:21 +0900 Subject: [PATCH 107/135] spirng batch --- .../CustomItemProcessor1.java | 11 ------ .../CustomItemProcessor2.java | 10 ----- .../CustomItemProcessor3.java | 11 ------ .../ProcessorClassifier.java | 21 ---------- .../springbatchlecture/ProcessorInfo.java | 11 ------ ...guration.java => RepeatConfiguration.java} | 39 +++++++------------ 6 files changed, 14 insertions(+), 89 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java rename src/main/java/io/springbatch/springbatchlecture/{ClassifierConfiguration.java => RepeatConfiguration.java} (57%) diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java deleted file mode 100644 index befcbf8..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor1.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; - -public class CustomItemProcessor1 implements ItemProcessor { - - @Override - public ProcessorInfo process(ProcessorInfo item) throws Exception { - return item; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java deleted file mode 100644 index 7290c74..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor2.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; - -public class CustomItemProcessor2 implements ItemProcessor { - - public ProcessorInfo process(ProcessorInfo item) throws Exception { - return item; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java b/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java deleted file mode 100644 index 783cd08..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/CustomItemProcessor3.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; - -public class CustomItemProcessor3 implements ItemProcessor { - - @Override - public ProcessorInfo process(ProcessorInfo item) throws Exception { - return item; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java b/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java deleted file mode 100644 index 53fc433..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/ProcessorClassifier.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; -import org.springframework.classify.Classifier; - -import java.util.HashMap; -import java.util.Map; - -public class ProcessorClassifier implements Classifier { - - private Map> processorMap = new HashMap<>(); - - @Override - public T classify(ProcessorInfo classifiable) { - return (T) processorMap.get(classifiable.getId()); - } - - public void setProcessorMap(Map> processorMap) { - this.processorMap = processorMap; - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java b/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java deleted file mode 100644 index 87e1e4f..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/ProcessorInfo.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.springbatch.springbatchlecture; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class ProcessorInfo { - - private int id; -} diff --git a/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java similarity index 57% rename from src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index 899b4ed..abb0f7a 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ClassifierConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -21,7 +21,7 @@ @RequiredArgsConstructor @Configuration -public class ClassifierConfiguration { +public class RepeatConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -37,40 +37,29 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) - .reader(new ItemReader() { + .chunk(10) + .reader(new ItemReader() { int i = 0; @Override - public ProcessorInfo read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { + public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { i++; - ProcessorInfo processorInfo = ProcessorInfo.builder().id(i).build(); - return i > 3 ? null : processorInfo; + + return i > 3 ? null : "item" + i; } }) - .processor(customItemProcessor()) - .writer(new ItemWriter() { + .processor(new ItemProcessor() { @Override - public void write(List items) throws Exception { + public String process(String item) throws Exception { + return item; + } + }) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { System.out.println(items); } }) .build(); } - - @Bean - public ItemProcessor customItemProcessor() { - - ClassifierCompositeItemProcessor processor = new ClassifierCompositeItemProcessor(); - - ProcessorClassifier classifier = new ProcessorClassifier<>(); - Map> processorMap = new HashMap<>(); - processorMap.put(1, new CustomItemProcessor1()); - processorMap.put(2, new CustomItemProcessor2()); - processorMap.put(3, new CustomItemProcessor3()); - classifier.setProcessorMap(processorMap); - processor.setClassifier(classifier); - - return processor; - } } From 03f571f982d1477d4c65ea92f0c13b31bd9241a5 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 24 Jun 2021 18:28:27 +0900 Subject: [PATCH 108/135] spirng batch --- .../io/springbatch/springbatchlecture/RepeatConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index abb0f7a..13283b4 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -43,7 +43,6 @@ public Step step1() throws Exception { @Override public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { i++; - return i > 3 ? null : "item" + i; } }) From 3e79d40b0d3da0a4e57dfa7cdb988dba9490df3f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 10:25:33 +0900 Subject: [PATCH 109/135] spirng batch --- .../RepeatConfiguration.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index 13283b4..c19fd22 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -10,6 +10,11 @@ import org.springframework.batch.item.support.ClassifierCompositeItemProcessor; import org.springframework.batch.item.support.CompositeItemProcessor; import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder; +import org.springframework.batch.repeat.RepeatCallback; +import org.springframework.batch.repeat.RepeatContext; +import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.repeat.policy.SimpleCompletionPolicy; +import org.springframework.batch.repeat.support.RepeatTemplate; import org.springframework.classify.PatternMatchingClassifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -37,7 +42,7 @@ public Job job() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) + .chunk(5) .reader(new ItemReader() { int i = 0; @Override @@ -49,6 +54,20 @@ public String read() throws Exception, UnexpectedInputException, ParseException, .processor(new ItemProcessor() { @Override public String process(String item) throws Exception { + + RepeatTemplate template = new RepeatTemplate(); + // 반복할 때마다 count 변수의 값을 1씩 증가 + // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 + template.setCompletionPolicy(new SimpleCompletionPolicy(2)); + template.iterate(new RepeatCallback() { + + public RepeatStatus doInIteration(RepeatContext context) { + System.out.println("repeatTest"); + return RepeatStatus.CONTINUABLE; + } + + }); + return item; } }) From d16c4eab7bbaa472b2a7924509284e79d9429532 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 10:31:27 +0900 Subject: [PATCH 110/135] spirng batch --- .../springbatch/springbatchlecture/RepeatConfiguration.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index c19fd22..86df724 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -13,7 +13,9 @@ import org.springframework.batch.repeat.RepeatCallback; import org.springframework.batch.repeat.RepeatContext; import org.springframework.batch.repeat.RepeatStatus; +import org.springframework.batch.repeat.exception.SimpleLimitExceptionHandler; import org.springframework.batch.repeat.policy.SimpleCompletionPolicy; +import org.springframework.batch.repeat.policy.TimeoutTerminationPolicy; import org.springframework.batch.repeat.support.RepeatTemplate; import org.springframework.classify.PatternMatchingClassifier; import org.springframework.context.annotation.Bean; @@ -59,6 +61,8 @@ public String process(String item) throws Exception { // 반복할 때마다 count 변수의 값을 1씩 증가 // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 template.setCompletionPolicy(new SimpleCompletionPolicy(2)); +// template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); + template.setExceptionHandler(new SimpleLimitExceptionHandler()); template.iterate(new RepeatCallback() { public RepeatStatus doInIteration(RepeatContext context) { From d385e375d7296b545653943fb6f74af475300926 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 10:44:40 +0900 Subject: [PATCH 111/135] spirng batch --- .../springbatchlecture/RepeatConfiguration.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index 86df724..79fcf2f 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -10,6 +10,7 @@ import org.springframework.batch.item.support.ClassifierCompositeItemProcessor; import org.springframework.batch.item.support.CompositeItemProcessor; import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder; +import org.springframework.batch.repeat.CompletionPolicy; import org.springframework.batch.repeat.RepeatCallback; import org.springframework.batch.repeat.RepeatContext; import org.springframework.batch.repeat.RepeatStatus; @@ -60,14 +61,15 @@ public String process(String item) throws Exception { RepeatTemplate template = new RepeatTemplate(); // 반복할 때마다 count 변수의 값을 1씩 증가 // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 - template.setCompletionPolicy(new SimpleCompletionPolicy(2)); +// template.setCompletionPolicy(new SimpleCompletionPolicy(2)); // template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); - template.setExceptionHandler(new SimpleLimitExceptionHandler()); + template.setExceptionHandler(simpleLimitExceptionHanlder()); template.iterate(new RepeatCallback() { public RepeatStatus doInIteration(RepeatContext context) { System.out.println("repeatTest"); - return RepeatStatus.CONTINUABLE; + throw new RuntimeException("test"); +// return RepeatStatus.CONTINUABLE; } }); @@ -83,5 +85,10 @@ public void write(List items) throws Exception { }) .build(); } + + @Bean + public SimpleLimitExceptionHandler simpleLimitExceptionHanlder(){ + return new SimpleLimitExceptionHandler(3); + } } From e71fd8428d2000cf16b17a371d93e4da6fed1b9f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 10:50:10 +0900 Subject: [PATCH 112/135] spirng batch --- .../springbatchlecture/RepeatConfiguration.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java index 79fcf2f..340313d 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -61,15 +61,17 @@ public String process(String item) throws Exception { RepeatTemplate template = new RepeatTemplate(); // 반복할 때마다 count 변수의 값을 1씩 증가 // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 -// template.setCompletionPolicy(new SimpleCompletionPolicy(2)); -// template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); - template.setExceptionHandler(simpleLimitExceptionHanlder()); + template.setCompletionPolicy(new SimpleCompletionPolicy(2)); + // 소요된 시간이 설정된 시간보다 클 경우 반복문 종료 + template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); + // 예외 제한 횟수만큼 반복문 실행 + template.setExceptionHandler(simpleLimitExceptionHandler()); template.iterate(new RepeatCallback() { public RepeatStatus doInIteration(RepeatContext context) { System.out.println("repeatTest"); - throw new RuntimeException("test"); -// return RepeatStatus.CONTINUABLE; +// throw new RuntimeException("test"); + return RepeatStatus.CONTINUABLE; } }); @@ -87,7 +89,7 @@ public void write(List items) throws Exception { } @Bean - public SimpleLimitExceptionHandler simpleLimitExceptionHanlder(){ + public SimpleLimitExceptionHandler simpleLimitExceptionHandler(){ return new SimpleLimitExceptionHandler(3); } } From 7f221063a5c58be46d92eb5aee0d966ca4ec43ae Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 10:53:19 +0900 Subject: [PATCH 113/135] spirng batch --- ...RepeatConfiguration.java => FaultTolerantConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{RepeatConfiguration.java => FaultTolerantConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java index 340313d..2370de7 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java @@ -29,7 +29,7 @@ @RequiredArgsConstructor @Configuration -public class RepeatConfiguration { +public class FaultTolerantConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 7e9f445cf35e07102c3db35a9d9ba521fabaacc2 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 11:22:52 +0900 Subject: [PATCH 114/135] spirng batch --- .../FaultTolerantConfiguration.java | 44 +++++-------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java index 2370de7..86cef12 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java @@ -49,42 +49,20 @@ public Step step1() throws Exception { .reader(new ItemReader() { int i = 0; @Override - public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { - i++; - return i > 3 ? null : "item" + i; + public String read() { + throw new IllegalArgumentException("skip"); +// i++; +// return i > 3 ? null : "item" + i; } }) - .processor(new ItemProcessor() { - @Override - public String process(String item) throws Exception { - - RepeatTemplate template = new RepeatTemplate(); - // 반복할 때마다 count 변수의 값을 1씩 증가 - // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 - template.setCompletionPolicy(new SimpleCompletionPolicy(2)); - // 소요된 시간이 설정된 시간보다 클 경우 반복문 종료 - template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); - // 예외 제한 횟수만큼 반복문 실행 - template.setExceptionHandler(simpleLimitExceptionHandler()); - template.iterate(new RepeatCallback() { - - public RepeatStatus doInIteration(RepeatContext context) { - System.out.println("repeatTest"); -// throw new RuntimeException("test"); - return RepeatStatus.CONTINUABLE; - } - - }); - - return item; - } - }) - .writer(new ItemWriter() { - @Override - public void write(List items) throws Exception { - System.out.println(items); - } + .processor((ItemProcessor) item -> { + throw new IllegalStateException("retry"); +// return item; }) + .writer(items -> System.out.println(items)) + .faultTolerant() + .skip(IllegalArgumentException.class) + .retry(IllegalStateException.class) .build(); } From 9f5a78205c0f084a1c91f14ef11474432ca324f1 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 13:19:58 +0900 Subject: [PATCH 115/135] spirng batch --- .../{FaultTolerantConfiguration.java => SkipConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{FaultTolerantConfiguration.java => SkipConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java index 86cef12..e47b677 100644 --- a/src/main/java/io/springbatch/springbatchlecture/FaultTolerantConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java @@ -29,7 +29,7 @@ @RequiredArgsConstructor @Configuration -public class FaultTolerantConfiguration { +public class SkipConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 943178bd84d4b022fade28a2b9bd35597259ab2f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 14:08:21 +0900 Subject: [PATCH 116/135] spirng batch --- .../springbatchlecture/NoSkipException.java | 13 ++++ .../springbatchlecture/SkipConfiguration.java | 65 +++++++++---------- .../springbatchlecture/SkipItemProcessor.java | 19 ++++++ .../springbatchlecture/SkipItemWriter.java | 23 +++++++ .../SkippableException.java | 13 ++++ 5 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/NoSkipException.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/SkippableException.java diff --git a/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java b/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java new file mode 100644 index 0000000..2b33aa6 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java @@ -0,0 +1,13 @@ + +package io.springbatch.springbatchlecture; + +public class NoSkipException extends Exception { + + public NoSkipException() { + super(); + } + + public NoSkipException(String msg) { + super(msg); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java index e47b677..cb2752b 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java @@ -4,28 +4,15 @@ import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.item.*; -import org.springframework.batch.item.adapter.ItemWriterAdapter; -import org.springframework.batch.item.support.ClassifierCompositeItemProcessor; -import org.springframework.batch.item.support.CompositeItemProcessor; -import org.springframework.batch.item.support.builder.CompositeItemProcessorBuilder; -import org.springframework.batch.repeat.CompletionPolicy; -import org.springframework.batch.repeat.RepeatCallback; -import org.springframework.batch.repeat.RepeatContext; -import org.springframework.batch.repeat.RepeatStatus; -import org.springframework.batch.repeat.exception.SimpleLimitExceptionHandler; -import org.springframework.batch.repeat.policy.SimpleCompletionPolicy; -import org.springframework.batch.repeat.policy.TimeoutTerminationPolicy; -import org.springframework.batch.repeat.support.RepeatTemplate; -import org.springframework.classify.PatternMatchingClassifier; +import org.springframework.batch.core.step.skip.SkipException; +import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; @RequiredArgsConstructor @Configuration @@ -46,29 +33,39 @@ public Job job() throws Exception { public Step step1() throws Exception { return stepBuilderFactory.get("step1") .chunk(5) - .reader(new ItemReader() { - int i = 0; - @Override - public String read() { - throw new IllegalArgumentException("skip"); -// i++; -// return i > 3 ? null : "item" + i; - } - }) - .processor((ItemProcessor) item -> { - throw new IllegalStateException("retry"); -// return item; - }) - .writer(items -> System.out.println(items)) + .reader(reader()) + .processor(processor()) + .writer(writer()) .faultTolerant() - .skip(IllegalArgumentException.class) - .retry(IllegalStateException.class) + .skip(SkippableException.class) + .skipLimit(3) .build(); } @Bean - public SimpleLimitExceptionHandler simpleLimitExceptionHandler(){ - return new SimpleLimitExceptionHandler(3); + public ListItemReader reader() { + + List items = new ArrayList<>(); + + for(int i = 0; i < 30; i++) { + items.add(String.valueOf(i)); + } + + return new ListItemReader<>(items); + } + + @Bean + @StepScope + public SkipItemProcessor processor() { + SkipItemProcessor processor = new SkipItemProcessor(); + return processor; + } + + @Bean + @StepScope + public SkipItemWriter writer() { + SkipItemWriter writer = new SkipItemWriter(); + return writer; } } diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java new file mode 100644 index 0000000..68fb665 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java @@ -0,0 +1,19 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemProcessor; + +public class SkipItemProcessor implements ItemProcessor { + + private int cnt = 0; + + @Override + public String process(String item) throws Exception { + if(item.equals("6")) { + cnt++; + throw new SkippableException("Process failed. cnt:" + cnt); + } + else { + return String.valueOf(Integer.valueOf(item) * -1); + } + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java new file mode 100644 index 0000000..a6996cb --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java @@ -0,0 +1,23 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.item.ItemWriter; + +import java.util.List; + +public class SkipItemWriter implements ItemWriter { + + private int cnt = 0; + + @Override + public void write(List items) throws Exception { + for (String item : items) { + if(item.equals("-12")) { + cnt++; + throw new SkippableException("Write failed. cnt:" + cnt); + } + else { + System.out.println(item); + } + } + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/SkippableException.java b/src/main/java/io/springbatch/springbatchlecture/SkippableException.java new file mode 100644 index 0000000..b221c3c --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/SkippableException.java @@ -0,0 +1,13 @@ + +package io.springbatch.springbatchlecture; + +public class SkippableException extends Exception { + + public SkippableException() { + super(); + } + + public SkippableException(String msg) { + super(msg); + } +} From 48d0af285c71fecf429d285325c90b9446f275c7 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 14:14:48 +0900 Subject: [PATCH 117/135] spirng batch --- .../io/springbatch/springbatchlecture/SkipConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java index cb2752b..e35d0dd 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java @@ -38,7 +38,7 @@ public Step step1() throws Exception { .writer(writer()) .faultTolerant() .skip(SkippableException.class) - .skipLimit(3) + .skipLimit(1) .build(); } From a1b1721a50359475306f8ae46e9d1dbe3a1b084e Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 14:40:17 +0900 Subject: [PATCH 118/135] spirng batch --- .../springbatch/springbatchlecture/SkipConfiguration.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java index e35d0dd..1ceccf2 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java @@ -6,6 +6,7 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy; import org.springframework.batch.core.step.skip.SkipException; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; @@ -37,8 +38,11 @@ public Step step1() throws Exception { .processor(processor()) .writer(writer()) .faultTolerant() +// .noSkip(SkippableException.class) // 아래 설정이 위의 설정을 덮어씀, skip() 설정이 우선 + .skipPolicy(new NeverSkipItemSkipPolicy()) .skip(SkippableException.class) - .skipLimit(1) + .skipLimit(2) +// .noRollback(SkippableException.class) .build(); } From 916fd9be4719879f732ce2596ba12da5849ff8d7 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 14:47:57 +0900 Subject: [PATCH 119/135] spirng batch --- .../springbatchlecture/SkipConfiguration.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java index 1ceccf2..4aae835 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java @@ -6,6 +6,7 @@ import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy; import org.springframework.batch.core.step.skip.SkipException; import org.springframework.batch.item.support.ListItemReader; @@ -13,7 +14,9 @@ import org.springframework.context.annotation.Configuration; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @RequiredArgsConstructor @Configuration @@ -39,13 +42,24 @@ public Step step1() throws Exception { .writer(writer()) .faultTolerant() // .noSkip(SkippableException.class) // 아래 설정이 위의 설정을 덮어씀, skip() 설정이 우선 - .skipPolicy(new NeverSkipItemSkipPolicy()) - .skip(SkippableException.class) - .skipLimit(2) + .skipPolicy(limitCheckingItemSkipPolicy()) +// .skip(SkippableException.class) +// .skipLimit(2) // .noRollback(SkippableException.class) .build(); } + @Bean + public LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy(){ + + Map, Boolean> skippableExceptionClasses = new HashMap<>(); + skippableExceptionClasses.put(SkippableException.class, true); + + LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy = new LimitCheckingItemSkipPolicy(2, skippableExceptionClasses); + + return limitCheckingItemSkipPolicy; + } + @Bean public ListItemReader reader() { From 73bdcffd9c018400fa52b23895829156d5d8657f Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 14:57:07 +0900 Subject: [PATCH 120/135] spirng batch --- .../springbatchlecture/NoRetryException.java | 13 +++++++++++++ .../springbatchlecture/NoSkipException.java | 13 ------------- ...pConfiguration.java => RetryConfiguration.java} | 14 ++++++-------- ...pItemProcessor.java => RetryItemProcessor.java} | 4 ++-- .../{SkipItemWriter.java => RetryItemWriter.java} | 4 ++-- .../springbatchlecture/RetryableException.java | 13 +++++++++++++ .../springbatchlecture/SkippableException.java | 13 ------------- 7 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/NoRetryException.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/NoSkipException.java rename src/main/java/io/springbatch/springbatchlecture/{SkipConfiguration.java => RetryConfiguration.java} (85%) rename src/main/java/io/springbatch/springbatchlecture/{SkipItemProcessor.java => RetryItemProcessor.java} (68%) rename src/main/java/io/springbatch/springbatchlecture/{SkipItemWriter.java => RetryItemWriter.java} (73%) create mode 100644 src/main/java/io/springbatch/springbatchlecture/RetryableException.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/SkippableException.java diff --git a/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java b/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java new file mode 100644 index 0000000..9664373 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java @@ -0,0 +1,13 @@ + +package io.springbatch.springbatchlecture; + +public class NoRetryException extends Exception { + + public NoRetryException() { + super(); + } + + public NoRetryException(String msg) { + super(msg); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java b/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java deleted file mode 100644 index 2b33aa6..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/NoSkipException.java +++ /dev/null @@ -1,13 +0,0 @@ - -package io.springbatch.springbatchlecture; - -public class NoSkipException extends Exception { - - public NoSkipException() { - super(); - } - - public NoSkipException(String msg) { - super(msg); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java similarity index 85% rename from src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java index 4aae835..ce860ad 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java @@ -7,8 +7,6 @@ import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; -import org.springframework.batch.core.step.skip.NeverSkipItemSkipPolicy; -import org.springframework.batch.core.step.skip.SkipException; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,7 +18,7 @@ @RequiredArgsConstructor @Configuration -public class SkipConfiguration { +public class RetryConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -53,7 +51,7 @@ public Step step1() throws Exception { public LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy(){ Map, Boolean> skippableExceptionClasses = new HashMap<>(); - skippableExceptionClasses.put(SkippableException.class, true); + skippableExceptionClasses.put(RetryableException.class, true); LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy = new LimitCheckingItemSkipPolicy(2, skippableExceptionClasses); @@ -74,15 +72,15 @@ public ListItemReader reader() { @Bean @StepScope - public SkipItemProcessor processor() { - SkipItemProcessor processor = new SkipItemProcessor(); + public RetryItemProcessor processor() { + RetryItemProcessor processor = new RetryItemProcessor(); return processor; } @Bean @StepScope - public SkipItemWriter writer() { - SkipItemWriter writer = new SkipItemWriter(); + public RetryItemWriter writer() { + RetryItemWriter writer = new RetryItemWriter(); return writer; } } diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java similarity index 68% rename from src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java rename to src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java index 68fb665..d7b377f 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipItemProcessor.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java @@ -2,7 +2,7 @@ import org.springframework.batch.item.ItemProcessor; -public class SkipItemProcessor implements ItemProcessor { +public class RetryItemProcessor implements ItemProcessor { private int cnt = 0; @@ -10,7 +10,7 @@ public class SkipItemProcessor implements ItemProcessor { public String process(String item) throws Exception { if(item.equals("6")) { cnt++; - throw new SkippableException("Process failed. cnt:" + cnt); + throw new RetryableException("Process failed. cnt:" + cnt); } else { return String.valueOf(Integer.valueOf(item) * -1); diff --git a/src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java similarity index 73% rename from src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java rename to src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java index a6996cb..15734e6 100644 --- a/src/main/java/io/springbatch/springbatchlecture/SkipItemWriter.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java @@ -4,7 +4,7 @@ import java.util.List; -public class SkipItemWriter implements ItemWriter { +public class RetryItemWriter implements ItemWriter { private int cnt = 0; @@ -13,7 +13,7 @@ public void write(List items) throws Exception { for (String item : items) { if(item.equals("-12")) { cnt++; - throw new SkippableException("Write failed. cnt:" + cnt); + throw new RetryableException("Write failed. cnt:" + cnt); } else { System.out.println(item); diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryableException.java b/src/main/java/io/springbatch/springbatchlecture/RetryableException.java new file mode 100644 index 0000000..8c33ab3 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/RetryableException.java @@ -0,0 +1,13 @@ + +package io.springbatch.springbatchlecture; + +public class RetryableException extends Exception { + + public RetryableException() { + super(); + } + + public RetryableException(String msg) { + super(msg); + } +} diff --git a/src/main/java/io/springbatch/springbatchlecture/SkippableException.java b/src/main/java/io/springbatch/springbatchlecture/SkippableException.java deleted file mode 100644 index b221c3c..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/SkippableException.java +++ /dev/null @@ -1,13 +0,0 @@ - -package io.springbatch.springbatchlecture; - -public class SkippableException extends Exception { - - public SkippableException() { - super(); - } - - public SkippableException(String msg) { - super(msg); - } -} From eef093970c187e6621eeb7febae92f9ab0b50961 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 16:50:44 +0900 Subject: [PATCH 121/135] spirng batch --- .../RetryItemProcessor.java | 20 +++++++++++++++---- .../springbatchlecture/RetryItemWriter.java | 10 ++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java index d7b377f..89ce0d4 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java @@ -8,11 +8,23 @@ public class RetryItemProcessor implements ItemProcessor { @Override public String process(String item) throws Exception { - if(item.equals("6")) { + if(item.equals("1")) { + cnt++; - throw new RetryableException("Process failed. cnt:" + cnt); - } - else { + if(cnt == 1) { + System.out.println("item " + item + " failed"); + throw new RetryableException("Process failed. cnt:" + cnt); + + }else if(cnt == 2) { + System.out.println("item " + item + " failed"); + throw new NoRetryException("Process failed. cnt:" + cnt); + + }else{ + System.out.println("Success!"); + return String.valueOf(Integer.valueOf(item) * -1); + + } + } else { return String.valueOf(Integer.valueOf(item) * -1); } } diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java index 15734e6..8783006 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java @@ -11,9 +11,15 @@ public class RetryItemWriter implements ItemWriter { @Override public void write(List items) throws Exception { for (String item : items) { - if(item.equals("-12")) { + if(item.equals("0")) { cnt++; - throw new RetryableException("Write failed. cnt:" + cnt); + if(cnt >= 3) { + System.out.println("Success!"); + } + else { + System.out.println("item " + item + " failed"); + throw new RetryableException("Write failed. cnt:" + cnt); + } } else { System.out.println(item); From daf4c0a019073a1bdf8be0740e445e1c8b11ebe0 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Fri, 25 Jun 2021 16:55:03 +0900 Subject: [PATCH 122/135] spirng batch --- .../RetryConfiguration.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java index ce860ad..2d9b1d7 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java @@ -10,6 +10,7 @@ import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.retry.policy.SimpleRetryPolicy; import java.util.ArrayList; import java.util.HashMap; @@ -39,23 +40,22 @@ public Step step1() throws Exception { .processor(processor()) .writer(writer()) .faultTolerant() -// .noSkip(SkippableException.class) // 아래 설정이 위의 설정을 덮어씀, skip() 설정이 우선 - .skipPolicy(limitCheckingItemSkipPolicy()) -// .skip(SkippableException.class) -// .skipLimit(2) -// .noRollback(SkippableException.class) + .noRetry(NoRetryException.class) + .retry(RetryableException.class) + .retryLimit(3) +// .retryPolicy(new SimpleRetryPolicy()) .build(); } @Bean - public LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy(){ + public SimpleRetryPolicy limitCheckingItemSkipPolicy(){ - Map, Boolean> skippableExceptionClasses = new HashMap<>(); - skippableExceptionClasses.put(RetryableException.class, true); + Map, Boolean> retryableExceptionClasses = new HashMap<>(); + retryableExceptionClasses.put(RetryableException.class, true); - LimitCheckingItemSkipPolicy limitCheckingItemSkipPolicy = new LimitCheckingItemSkipPolicy(2, skippableExceptionClasses); + SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(3, retryableExceptionClasses); - return limitCheckingItemSkipPolicy; + return simpleRetryPolicy; } @Bean From 2fb4fcd84d2c5c6c83a4486c90b668f038f654ef Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Mon, 28 Jun 2021 11:36:37 +0900 Subject: [PATCH 123/135] spirng batch --- .../springbatchlecture/NoRetryException.java | 13 ----- .../RetryItemProcessor.java | 31 ----------- .../springbatchlecture/RetryItemWriter.java | 29 ---------- .../RetryableException.java | 13 ----- ...guration.java => ThreadConfiguration.java} | 53 +++++++------------ 5 files changed, 19 insertions(+), 120 deletions(-) delete mode 100644 src/main/java/io/springbatch/springbatchlecture/NoRetryException.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java delete mode 100644 src/main/java/io/springbatch/springbatchlecture/RetryableException.java rename src/main/java/io/springbatch/springbatchlecture/{RetryConfiguration.java => ThreadConfiguration.java} (60%) diff --git a/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java b/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java deleted file mode 100644 index 9664373..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/NoRetryException.java +++ /dev/null @@ -1,13 +0,0 @@ - -package io.springbatch.springbatchlecture; - -public class NoRetryException extends Exception { - - public NoRetryException() { - super(); - } - - public NoRetryException(String msg) { - super(msg); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java deleted file mode 100644 index 89ce0d4..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/RetryItemProcessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemProcessor; - -public class RetryItemProcessor implements ItemProcessor { - - private int cnt = 0; - - @Override - public String process(String item) throws Exception { - if(item.equals("1")) { - - cnt++; - if(cnt == 1) { - System.out.println("item " + item + " failed"); - throw new RetryableException("Process failed. cnt:" + cnt); - - }else if(cnt == 2) { - System.out.println("item " + item + " failed"); - throw new NoRetryException("Process failed. cnt:" + cnt); - - }else{ - System.out.println("Success!"); - return String.valueOf(Integer.valueOf(item) * -1); - - } - } else { - return String.valueOf(Integer.valueOf(item) * -1); - } - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java b/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java deleted file mode 100644 index 8783006..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/RetryItemWriter.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.springbatch.springbatchlecture; - -import org.springframework.batch.item.ItemWriter; - -import java.util.List; - -public class RetryItemWriter implements ItemWriter { - - private int cnt = 0; - - @Override - public void write(List items) throws Exception { - for (String item : items) { - if(item.equals("0")) { - cnt++; - if(cnt >= 3) { - System.out.println("Success!"); - } - else { - System.out.println("item " + item + " failed"); - throw new RetryableException("Write failed. cnt:" + cnt); - } - } - else { - System.out.println(item); - } - } - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryableException.java b/src/main/java/io/springbatch/springbatchlecture/RetryableException.java deleted file mode 100644 index 8c33ab3..0000000 --- a/src/main/java/io/springbatch/springbatchlecture/RetryableException.java +++ /dev/null @@ -1,13 +0,0 @@ - -package io.springbatch.springbatchlecture; - -public class RetryableException extends Exception { - - public RetryableException() { - super(); - } - - public RetryableException(String msg) { - super(msg); - } -} diff --git a/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java similarity index 60% rename from src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java index 2d9b1d7..995acb7 100644 --- a/src/main/java/io/springbatch/springbatchlecture/RetryConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java @@ -7,9 +7,12 @@ import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.retry.policy.SimpleRetryPolicy; import java.util.ArrayList; @@ -19,7 +22,7 @@ @RequiredArgsConstructor @Configuration -public class RetryConfiguration { +public class ThreadConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @@ -37,51 +40,33 @@ public Step step1() throws Exception { return stepBuilderFactory.get("step1") .chunk(5) .reader(reader()) - .processor(processor()) - .writer(writer()) - .faultTolerant() - .noRetry(NoRetryException.class) - .retry(RetryableException.class) - .retryLimit(3) -// .retryPolicy(new SimpleRetryPolicy()) + .processor(new ItemProcessor() { + @Override + public String process(String item) throws Exception { + System.out.println("item = " + item); + return item; + } + }) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { + System.out.println("items = " + items); + } + }) + .taskExecutor(new SimpleAsyncTaskExecutor()) .build(); } - @Bean - public SimpleRetryPolicy limitCheckingItemSkipPolicy(){ - - Map, Boolean> retryableExceptionClasses = new HashMap<>(); - retryableExceptionClasses.put(RetryableException.class, true); - - SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(3, retryableExceptionClasses); - - return simpleRetryPolicy; - } - @Bean public ListItemReader reader() { List items = new ArrayList<>(); - for(int i = 0; i < 30; i++) { + for(int i = 0; i < 10; i++) { items.add(String.valueOf(i)); } return new ListItemReader<>(items); } - - @Bean - @StepScope - public RetryItemProcessor processor() { - RetryItemProcessor processor = new RetryItemProcessor(); - return processor; - } - - @Bean - @StepScope - public RetryItemWriter writer() { - RetryItemWriter writer = new RetryItemWriter(); - return writer; - } } From 335040f44b37f5f23fed3d2afec6bdd43732fc3c Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 10:09:25 +0900 Subject: [PATCH 124/135] spirng batch --- .../{ThreadConfiguration.java => AsyncConfiguration.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/io/springbatch/springbatchlecture/{ThreadConfiguration.java => AsyncConfiguration.java} (98%) diff --git a/src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java similarity index 98% rename from src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java rename to src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 995acb7..9ca7c9c 100644 --- a/src/main/java/io/springbatch/springbatchlecture/ThreadConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -22,7 +22,7 @@ @RequiredArgsConstructor @Configuration -public class ThreadConfiguration { +public class AsyncConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; From 346594c3122c0b18ede3b2709783d8c79f043a28 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 10:13:12 +0900 Subject: [PATCH 125/135] spirng batch --- .../AsyncConfiguration.java | 108 +++++++++++++----- 1 file changed, 79 insertions(+), 29 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 9ca7c9c..d95aa8e 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -9,16 +9,19 @@ import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.database.JdbcPagingItemReader; +import org.springframework.batch.item.database.Order; +import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.retry.policy.SimpleRetryPolicy; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import javax.sql.DataSource; +import java.util.*; @RequiredArgsConstructor @Configuration @@ -26,6 +29,7 @@ public class AsyncConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; + private final DataSource dataSource; @Bean public Job job() throws Exception { @@ -36,37 +40,83 @@ public Job job() throws Exception { } @Bean - public Step step1() throws Exception { - return stepBuilderFactory.get("step1") - .chunk(5) - .reader(reader()) - .processor(new ItemProcessor() { - @Override - public String process(String item) throws Exception { - System.out.println("item = " + item); - return item; - } - }) - .writer(new ItemWriter() { - @Override - public void write(List items) throws Exception { - System.out.println("items = " + items); - } - }) - .taskExecutor(new SimpleAsyncTaskExecutor()) - .build(); + public JdbcPagingItemReader pagingItemReader() { + JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); + + reader.setDataSource(this.dataSource); + reader.setFetchSize(1000); + reader.setRowMapper(new CustomerRowMapper()); + + MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); + queryProvider.setSelectClause("id, firstName, lastName, birthdate"); + queryProvider.setFromClause("from customer"); + + Map sortKeys = new HashMap<>(1); + + sortKeys.put("id", Order.ASCENDING); + + queryProvider.setSortKeys(sortKeys); + + reader.setQueryProvider(queryProvider); + + return reader; + } + + @Bean + public ItemProcessor itemProcessor() { + return new ItemProcessor() { + @Override + public Customer process(Customer item) throws Exception { + Thread.sleep(new Random().nextInt(10)); + return new Customer(item.getId(), + item.getFirstName().toUpperCase(), + item.getLastName().toUpperCase(), + item.getBirthdate()); + } + }; + } + + @Bean + public AsyncItemProcessor asyncItemProcessor() throws Exception { + AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor(); + + asyncItemProcessor.setDelegate(itemProcessor()); + asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); + asyncItemProcessor.afterPropertiesSet(); + + return asyncItemProcessor; + } + + @Bean + public JdbcBatchItemWriter customerItemWriter() { + JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); + + itemWriter.setDataSource(this.dataSource); + itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); + itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + itemWriter.afterPropertiesSet(); + + return itemWriter; } @Bean - public ListItemReader reader() { + public AsyncItemWriter asyncItemWriter() throws Exception { + AsyncItemWriter asyncItemWriter = new AsyncItemWriter<>(); - List items = new ArrayList<>(); + asyncItemWriter.setDelegate(customerItemWriter()); + asyncItemWriter.afterPropertiesSet(); - for(int i = 0; i < 10; i++) { - items.add(String.valueOf(i)); - } + return asyncItemWriter; + } - return new ListItemReader<>(items); + @Bean + public Step step1() throws Exception { + return stepBuilderFactory.get("step1") + .chunk(1000) + .reader(pagingItemReader()) + .processor(asyncItemProcessor()) + .writer(asyncItemWriter()) + .build(); } } From a53e71dd17121899b3f93d7668a8c18068d14702 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 10:35:44 +0900 Subject: [PATCH 126/135] spirng batch --- pom.xml | 4 ++++ .../springbatchlecture/AsyncConfiguration.java | 10 +++++++--- .../springbatchlecture/Customer.java | 17 +++++++++++++++++ .../springbatchlecture/CustomerRowMapper.java | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/Customer.java create mode 100644 src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java diff --git a/pom.xml b/pom.xml index 7445dab..0c06eb7 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,10 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.batch + spring-batch-integration + mysql mysql-connector-java diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index d95aa8e..43a15be 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -7,6 +7,8 @@ import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; +import org.springframework.batch.integration.async.AsyncItemProcessor; +import org.springframework.batch.integration.async.AsyncItemWriter; import org.springframework.batch.item.ItemProcessor; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; @@ -67,7 +69,9 @@ public ItemProcessor itemProcessor() { return new ItemProcessor() { @Override public Customer process(Customer item) throws Exception { - Thread.sleep(new Random().nextInt(10)); + + Thread.sleep(10); + return new Customer(item.getId(), item.getFirstName().toUpperCase(), item.getLastName().toUpperCase(), @@ -92,7 +96,7 @@ public JdbcBatchItemWriter customerItemWriter() { JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); - itemWriter.setSql("INSERT INTO NEW_CUSTOMER VALUES (:id, :firstName, :lastName, :birthdate)"); + itemWriter.setSql("insert into customer2 values (:id, :firstName, :lastName, :birthdate)"); itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); itemWriter.afterPropertiesSet(); @@ -112,7 +116,7 @@ public AsyncItemWriter asyncItemWriter() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(1000) + .chunk(10) .reader(pagingItemReader()) .processor(asyncItemProcessor()) .writer(asyncItemWriter()) diff --git a/src/main/java/io/springbatch/springbatchlecture/Customer.java b/src/main/java/io/springbatch/springbatchlecture/Customer.java new file mode 100644 index 0000000..d1559d6 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/Customer.java @@ -0,0 +1,17 @@ + +package io.springbatch.springbatchlecture; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Date; + +@Data +@AllArgsConstructor +public class Customer { + + private final long id; + private final String firstName; + private final String lastName; + private final Date birthdate; +} diff --git a/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java b/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java new file mode 100644 index 0000000..fe34382 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/CustomerRowMapper.java @@ -0,0 +1,16 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CustomerRowMapper implements RowMapper { + @Override + public Customer mapRow(ResultSet rs, int i) throws SQLException { + return new Customer(rs.getLong("id"), + rs.getString("firstName"), + rs.getString("lastName"), + rs.getDate("birthdate")); + } +} From ef3a9d651ce53dd09e77979e67752f713ece7081 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 11:35:32 +0900 Subject: [PATCH 127/135] spirng batch --- .../AsyncConfiguration.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 43a15be..9efc297 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -4,23 +4,18 @@ import org.springframework.batch.core.*; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; -import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.launch.support.RunIdIncrementer; -import org.springframework.batch.core.step.skip.LimitCheckingItemSkipPolicy; import org.springframework.batch.integration.async.AsyncItemProcessor; import org.springframework.batch.integration.async.AsyncItemWriter; import org.springframework.batch.item.ItemProcessor; -import org.springframework.batch.item.ItemWriter; import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; import org.springframework.batch.item.database.JdbcBatchItemWriter; import org.springframework.batch.item.database.JdbcPagingItemReader; import org.springframework.batch.item.database.Order; import org.springframework.batch.item.database.support.MySqlPagingQueryProvider; -import org.springframework.batch.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.SimpleAsyncTaskExecutor; -import org.springframework.retry.policy.SimpleRetryPolicy; import javax.sql.DataSource; import java.util.*; @@ -37,7 +32,8 @@ public class AsyncConfiguration { public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) - .start(step1()) +// .start(step1()) + .start(asyncStep1()) .build(); } @@ -46,7 +42,7 @@ public JdbcPagingItemReader pagingItemReader() { JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); reader.setDataSource(this.dataSource); - reader.setFetchSize(1000); + reader.setFetchSize(300); reader.setRowMapper(new CustomerRowMapper()); MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); @@ -65,7 +61,7 @@ public JdbcPagingItemReader pagingItemReader() { } @Bean - public ItemProcessor itemProcessor() { + public ItemProcessor customItemProcessor() { return new ItemProcessor() { @Override public Customer process(Customer item) throws Exception { @@ -84,7 +80,7 @@ public Customer process(Customer item) throws Exception { public AsyncItemProcessor asyncItemProcessor() throws Exception { AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor(); - asyncItemProcessor.setDelegate(itemProcessor()); + asyncItemProcessor.setDelegate(customItemProcessor()); asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); asyncItemProcessor.afterPropertiesSet(); @@ -92,7 +88,7 @@ public AsyncItemProcessor asyncItemProcessor() throws Exception { } @Bean - public JdbcBatchItemWriter customerItemWriter() { + public JdbcBatchItemWriter customItemWriter() { JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); itemWriter.setDataSource(this.dataSource); @@ -107,7 +103,7 @@ public JdbcBatchItemWriter customerItemWriter() { public AsyncItemWriter asyncItemWriter() throws Exception { AsyncItemWriter asyncItemWriter = new AsyncItemWriter<>(); - asyncItemWriter.setDelegate(customerItemWriter()); + asyncItemWriter.setDelegate(customItemWriter()); asyncItemWriter.afterPropertiesSet(); return asyncItemWriter; @@ -116,7 +112,17 @@ public AsyncItemWriter asyncItemWriter() throws Exception { @Bean public Step step1() throws Exception { return stepBuilderFactory.get("step1") - .chunk(10) + .chunk(300) + .reader(pagingItemReader()) + .processor(customItemProcessor()) + .writer(customItemWriter()) + .build(); + } + + @Bean + public Step asyncStep1() throws Exception { + return stepBuilderFactory.get("asyncStep1") + .chunk(300) .reader(pagingItemReader()) .processor(asyncItemProcessor()) .writer(asyncItemWriter()) From ec65e2df2169493bf1fed8980ddedf1023639ff9 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 14:45:32 +0900 Subject: [PATCH 128/135] spirng batch --- .../springbatchlecture/AsyncConfiguration.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 9efc297..3dc5393 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -16,9 +16,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import javax.sql.DataSource; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; @RequiredArgsConstructor @Configuration @@ -126,7 +131,17 @@ public Step asyncStep1() throws Exception { .reader(pagingItemReader()) .processor(asyncItemProcessor()) .writer(asyncItemWriter()) + .taskExecutor(taskExecutor()) .build(); } + + @Bean + public TaskExecutor taskExecutor(){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(4); + executor.setMaxPoolSize(8); + executor.setThreadNamePrefix("async-thread-"); + return executor; + } } From dadb7b7dffe22e0a31c7ec3fcfe2292df917e2a7 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 15:28:00 +0900 Subject: [PATCH 129/135] spirng batch --- .../AsyncConfiguration.java | 5 +++-- .../StopWatchJobListener.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/springbatch/springbatchlecture/StopWatchJobListener.java diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 3dc5393..f316bef 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -37,8 +37,9 @@ public class AsyncConfiguration { public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) -// .start(step1()) - .start(asyncStep1()) + .start(step1()) +// .start(asyncStep1()) + .listener(new StopWatchJobListener()) .build(); } diff --git a/src/main/java/io/springbatch/springbatchlecture/StopWatchJobListener.java b/src/main/java/io/springbatch/springbatchlecture/StopWatchJobListener.java new file mode 100644 index 0000000..98d4c25 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/StopWatchJobListener.java @@ -0,0 +1,19 @@ +package io.springbatch.springbatchlecture; + +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobExecutionListener; + +public class StopWatchJobListener implements JobExecutionListener { + + @Override + public void beforeJob(JobExecution jobExecution) { + } + + @Override + public void afterJob(JobExecution jobExecution) { + long time = jobExecution.getEndTime().getTime() - jobExecution.getStartTime().getTime(); + System.out.println("=========================================="); + System.out.println("총 소요된 시간 : " + time); + System.out.println("=========================================="); + } +} From deea1d0f357f04bfa9ab4453cf2214bd30ce6df1 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 17:08:45 +0900 Subject: [PATCH 130/135] spirng batch --- .../io/springbatch/springbatchlecture/AsyncConfiguration.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index f316bef..66488f7 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -142,6 +142,7 @@ public TaskExecutor taskExecutor(){ executor.setCorePoolSize(4); executor.setMaxPoolSize(8); executor.setThreadNamePrefix("async-thread-"); +// executor.initialize(); return executor; } } From f9d912318bda96bbef850f8de3d84797bbfd22cb Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Tue, 29 Jun 2021 17:09:29 +0900 Subject: [PATCH 131/135] spirng batch --- .../io/springbatch/springbatchlecture/AsyncConfiguration.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 66488f7..f316bef 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -142,7 +142,6 @@ public TaskExecutor taskExecutor(){ executor.setCorePoolSize(4); executor.setMaxPoolSize(8); executor.setThreadNamePrefix("async-thread-"); -// executor.initialize(); return executor; } } From 5dd57b2f7a951439629d113d8f8a6b80fc203a3c Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Thu, 2 Sep 2021 22:48:38 +0900 Subject: [PATCH 132/135] spring batch --- .../AsyncConfiguration.java | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index f316bef..f5c6387 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -37,12 +37,33 @@ public class AsyncConfiguration { public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) - .start(step1()) -// .start(asyncStep1()) +// .start(step1()) + .start(asyncStep1()) .listener(new StopWatchJobListener()) .build(); } + @Bean + public Step step1() throws Exception { + return stepBuilderFactory.get("step1") + .chunk(100) + .reader(pagingItemReader()) + .processor(customItemProcessor()) + .writer(customItemWriter()) + .build(); + } + + @Bean + public Step asyncStep1() throws Exception { + return stepBuilderFactory.get("asyncStep1") + .chunk(100) + .reader(pagingItemReader()) + .processor(asyncItemProcessor()) + .writer(asyncItemWriter()) +// .taskExecutor(taskExecutor()) + .build(); + } + @Bean public JdbcPagingItemReader pagingItemReader() { JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); @@ -72,7 +93,7 @@ public ItemProcessor customItemProcessor() { @Override public Customer process(Customer item) throws Exception { - Thread.sleep(10); + Thread.sleep(100); return new Customer(item.getId(), item.getFirstName().toUpperCase(), @@ -82,17 +103,6 @@ public Customer process(Customer item) throws Exception { }; } - @Bean - public AsyncItemProcessor asyncItemProcessor() throws Exception { - AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor(); - - asyncItemProcessor.setDelegate(customItemProcessor()); - asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); - asyncItemProcessor.afterPropertiesSet(); - - return asyncItemProcessor; - } - @Bean public JdbcBatchItemWriter customItemWriter() { JdbcBatchItemWriter itemWriter = new JdbcBatchItemWriter<>(); @@ -105,6 +115,18 @@ public JdbcBatchItemWriter customItemWriter() { return itemWriter; } + @Bean + public AsyncItemProcessor asyncItemProcessor() throws Exception { + AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor(); + + asyncItemProcessor.setDelegate(customItemProcessor()); +// asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); + asyncItemProcessor.setTaskExecutor(taskExecutor()); + asyncItemProcessor.afterPropertiesSet(); + + return asyncItemProcessor; + } + @Bean public AsyncItemWriter asyncItemWriter() throws Exception { AsyncItemWriter asyncItemWriter = new AsyncItemWriter<>(); @@ -115,26 +137,7 @@ public AsyncItemWriter asyncItemWriter() throws Exception { return asyncItemWriter; } - @Bean - public Step step1() throws Exception { - return stepBuilderFactory.get("step1") - .chunk(300) - .reader(pagingItemReader()) - .processor(customItemProcessor()) - .writer(customItemWriter()) - .build(); - } - @Bean - public Step asyncStep1() throws Exception { - return stepBuilderFactory.get("asyncStep1") - .chunk(300) - .reader(pagingItemReader()) - .processor(asyncItemProcessor()) - .writer(asyncItemWriter()) - .taskExecutor(taskExecutor()) - .build(); - } @Bean public TaskExecutor taskExecutor(){ From 587ac6367d8ed2cc7eac168463c4762b4624fc2d Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Sat, 4 Sep 2021 12:20:40 +0900 Subject: [PATCH 133/135] spring batch --- .../springbatchlecture/AsyncConfiguration.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index f5c6387..505d9f4 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -37,8 +37,8 @@ public class AsyncConfiguration { public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) -// .start(step1()) - .start(asyncStep1()) + .start(step1()) +// .start(asyncStep1()) .listener(new StopWatchJobListener()) .build(); } @@ -93,7 +93,7 @@ public ItemProcessor customItemProcessor() { @Override public Customer process(Customer item) throws Exception { - Thread.sleep(100); + Thread.sleep(1000); return new Customer(item.getId(), item.getFirstName().toUpperCase(), @@ -120,8 +120,8 @@ public AsyncItemProcessor asyncItemProcessor() throws Exception { AsyncItemProcessor asyncItemProcessor = new AsyncItemProcessor(); asyncItemProcessor.setDelegate(customItemProcessor()); -// asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); - asyncItemProcessor.setTaskExecutor(taskExecutor()); + asyncItemProcessor.setTaskExecutor(new SimpleAsyncTaskExecutor()); +// asyncItemProcessor.setTaskExecutor(taskExecutor()); asyncItemProcessor.afterPropertiesSet(); return asyncItemProcessor; From 820dfcf00a4f03ef503aed7b4d71cff8c7442584 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 22 Sep 2021 17:32:11 +0900 Subject: [PATCH 134/135] spring batch --- .../io/springbatch/springbatchlecture/AsyncConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 505d9f4..8eebae3 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -60,7 +60,7 @@ public Step asyncStep1() throws Exception { .reader(pagingItemReader()) .processor(asyncItemProcessor()) .writer(asyncItemWriter()) -// .taskExecutor(taskExecutor()) + .taskExecutor(taskExecutor()) .build(); } @@ -69,7 +69,7 @@ public JdbcPagingItemReader pagingItemReader() { JdbcPagingItemReader reader = new JdbcPagingItemReader<>(); reader.setDataSource(this.dataSource); - reader.setFetchSize(300); + reader.setPageSize(100); reader.setRowMapper(new CustomerRowMapper()); MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider(); From 654efb277b6d0a727593797c0e359ea259d29906 Mon Sep 17 00:00:00 2001 From: onjsdnjs Date: Wed, 22 Sep 2021 17:35:24 +0900 Subject: [PATCH 135/135] spring batch --- .../io/springbatch/springbatchlecture/AsyncConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java index 8eebae3..f86c7c3 100644 --- a/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java +++ b/src/main/java/io/springbatch/springbatchlecture/AsyncConfiguration.java @@ -37,8 +37,8 @@ public class AsyncConfiguration { public Job job() throws Exception { return jobBuilderFactory.get("batchJob") .incrementer(new RunIdIncrementer()) - .start(step1()) -// .start(asyncStep1()) +// .start(step1()) + .start(asyncStep1()) .listener(new StopWatchJobListener()) .build(); }