본문 바로가기

강의/스프링배치

TaskletStep

spring batch 가 제공하는 step의 구현체 중에서 가장 기본이 되는 구현체이다.

stepBuilder 클래스가 하위 builder 클래스를 통해서 다양한 step을 만들 수 있는데

그중 우리는 TaskletStep을 실행시키는 Step에 대해서 살펴볼 예정이다.

 

repeatTemplate은 반복하는 기능을 가진 클래스이다.

TaskletStep은 반복 실행이 기본이다.

 

taskletstep은 task기반과 chunk 기반으로 나눠져 있다.

 

 

 

 

 

 

 

repeatTemplate을 설정하는 클래스 stepOperations (반복에 대한 설정)

taskexecutor는 multithread로 task를 수행해야 하는 경우에 대한 설정

 

AbstractStep 에서 execute 메서드에서 실행이 됨 (SimpleJob이 실행시킨다고 보면 된다.)

각각의 stepExecution의 속성이 설정된다.

doExecute를 통해 각각의 구현체에서 실행이 된다.

StepExecution을 파라미터로 받아오는데 여기에다가 속성을 저장하고 doExecute 메서드를 통해

각각의 클래스가 구현한 doExecute를 실행한다.

 

taskletStep을 생성할 때 반복문 즉 repeat template 객체라고 보면 된다.

여기에서 iterate를 통해 반복한다.

 

 

 

우리가 설정하였던 tasklet이 실행되는 지역임

tasklet 실행시 RepeatStatus.Finished를 return 받도록 하였으니

result = FINISHED가 될 것임.

우리가 설정하였던 tasklet (아래 그림 참고)

 

 

chunk 기반의 step은 아래와 같이 configuration 설정을 할 것이다.

@Bean
public Step chunkStep() {
    return stepBuilderFactory.get("chunkStep")
            .<String, String>chunk(3)
            .reader(new ListItemReader(Arrays.asList("item1","item2","item3")))
            .processor(new ItemProcessor<String, String>() {
                @Override
                public String process(String item) throws Exception {
                    return item.toUpperCase();
                }
            })
            .writer(list -> {
                list.forEach(item -> System.out.println(item));
            })
            .build();
}

 

chunk 기반의 step이 진행되는 과정도 아래 그림까지는 동일하다.

 

이때의 tasklet은 spring batch가 만든 chunk oriented tasklet이다.

 

Item reader에서 data를 읽고

item processor에서 data를 변형하고

item writer에서 data를 쓰는 작업을 하는 것을 살펴볼 것이다.

 

chunkProvider가 item reader의 정보를 가지고 있는 것이다.

ChunkOrientedTasklet.class

 

 

 

 

전체 configuration

package io.springbatch.springbatch;

import lombok.RequiredArgsConstructor;
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.item.ItemProcessor;
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;

@RequiredArgsConstructor
@Configuration
public class TaskletStepConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job batchJob() {
        return this.jobBuilderFactory.get("batchJob")
                .start(taskStep())
                .next(chunkStep())
                .build();
    }

    // 단일 task 타입의 process
    @Bean
    public Step taskStep() {
        return stepBuilderFactory.get("taskStep")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("step1 has executed");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    @Bean
    public Step chunkStep() {
        return stepBuilderFactory.get("chunkStep")
                .<String, String>chunk(3)
                .reader(new ListItemReader(Arrays.asList("item1","item2","item3")))
                .processor(new ItemProcessor<String, String>() {
                    @Override
                    public String process(String item) throws Exception {
                        return item.toUpperCase();
                    }
                })
                .writer(list -> {
                    list.forEach(item -> System.out.println(item));
                })
                .build();
    }

}

'강의 > 스프링배치' 카테고리의 다른 글

TaskletStep 아키텍처  (0) 2023.01.21
tasklet() - startlimit() / allowStartIfComplete  (0) 2023.01.21
StepBuilderfactory  (0) 2023.01.15
simpleJob 아키텍처  (0) 2023.01.15
스프링 배치 실행 - incrementer()  (0) 2023.01.15