diff --git a/pom.xml b/pom.xml index 38d49b1..7445dab 100644 --- a/pom.xml +++ b/pom.xml @@ -14,29 +14,42 @@ spring-batch-lecture Demo project for Spring Boot - 11 + 1.8 org.springframework.boot spring-boot-starter-batch - + + org.springframework.boot + spring-boot-starter-data-jpa + mysql mysql-connector-java runtime - org.springframework.boot - spring-boot-configuration-processor - true + com.h2database + h2 + runtime org.projectlombok 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/RepeatConfiguration.java b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java new file mode 100644 index 0000000..8de4b51 --- /dev/null +++ b/src/main/java/io/springbatch/springbatchlecture/RepeatConfiguration.java @@ -0,0 +1,108 @@ +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.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.CompositeCompletionPolicy; +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; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@Configuration +public class RepeatConfiguration { + + private final JobBuilderFactory jobBuilderFactory; + private final StepBuilderFactory stepBuilderFactory; + + @Bean + public Job job() throws Exception { + return jobBuilderFactory.get("batchJob") + .incrementer(new RunIdIncrementer()) + .start(step1()) + .build(); + } + + @Bean + public Step step1() throws Exception { + return stepBuilderFactory.get("step1") + .chunk(5) + .reader(new ItemReader() { + int i = 0; + @Override + public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { + i++; + return i > 3 ? null : "item" + i; + } + }) + .processor(new ItemProcessor() { + + RepeatTemplate template = new RepeatTemplate(); + + @Override + public String process(String item) throws Exception { + + // 반복할 때마다 count 변수의 값을 1씩 증가 + // count 값이 chunkSize 값보다 크거나 같을 때 반복문 종료 +// template.setCompletionPolicy(new SimpleCompletionPolicy(2)); + // 소요된 시간이 설정된 시간보다 클 경우 반복문 종료 +// template.setCompletionPolicy(new TimeoutTerminationPolicy(3000)); + + // 여러 유형의 CompletionPolicy 를 복합적으로 처리함 + // 여러 개 중에 먼저 조건이 부합하는 CompletionPolicy 에 따라 반복문이 종료됨 +// CompositeCompletionPolicy completionPolicy = new CompositeCompletionPolicy(); +// CompletionPolicy[] completionPolicies = new CompletionPolicy[]{new TimeoutTerminationPolicy(3000),new SimpleCompletionPolicy(2)}; +// completionPolicy.setPolicies(completionPolicies); +// template.setCompletionPolicy(completionPolicy); + + // 예외 제한 횟수만큼 반복문 실행 + template.setExceptionHandler(simpleLimitExceptionHandler()); + + template.iterate(new RepeatCallback() { + + public RepeatStatus doInIteration(RepeatContext context) { + System.out.println("repeatTest"); + throw new RuntimeException("Exception is occurred"); +// return RepeatStatus.CONTINUABLE; + } + + }); + + return item; + } + }) + .writer(new ItemWriter() { + @Override + public void write(List items) throws Exception { + System.out.println(items); + } + }) + .build(); + } + + @Bean + public SimpleLimitExceptionHandler simpleLimitExceptionHandler(){ + return new SimpleLimitExceptionHandler(2); + } +} + 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 deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..4fb13ef --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,37 @@ +spring: + profiles: + active: local + batch: + job: +# enabled: false + names: ${job.name:NONE} + +--- +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 diff --git a/src/main/resources/customer.json b/src/main/resources/customer.json new file mode 100644 index 0000000..e69de29