(스프링 배치) 20-2. tasklet() API 소개

기본 사상

Tasklet 유형에 대한 클래스를 설정합니다.

작은 일

  • 단계에서 구성되고 실행되는 도메인 개체입니다.

  • 최대 단일 작업 다하다
  • TaskletStep에 의해 반복적으로 실행됩니다.

    반환 값에 따라 CONTINUED 또는 FINISHED 상태가 가능합니다.

  • RepeatStatus – Tasklet 반복 상태 값
상태 설명하다
중복 상태.마치다 Tasklet을 완료하기 위해 null의 RepeatStatus를 반환하는 것은 RepeatStatus.FINISHED로 해석됩니다.

RepeatStatus.CONTINUABLE RepeatStatus.FINISH가 반환되거나 실패 예외가 발생할 때까지 while 문에서 TaskletStep에 의해 반복적으로 호출됩니다(무한 루프 참고).
  • 익명 또는 구현 클래스를 만들고 사용합니다.

  • 이 메서드가 실행되면 TaskletStepBuilder를 반환하며 관련 API를 설정할 수 있습니다.

  • 하나의 Step에는 하나의 Tasklet만 설정할 수 있으며, 2개 이상 설정하면 마지막으로 설정한 객체가 실행됩니다.

구조

작은 일
RepeatStatus execute(StepContribution, ChunkContext);

소스 코드

TaskletConfiguration.java

package io.springbatch.springbatchlecture.TaskAPI;

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 TaskletConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;
    private final customTasklet customTasklet;

    @Bean
    public Job batchJob(){
        return this.jobBuilderFactory.get("batchJob")
                .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("stepContribution: " + contribution + "ChunkContext: " + chunkContext);
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }
    @Bean
    public Step step2() {
        //구현 클래스 이용
        return stepBuilderFactory.get("step2")
                .tasklet(customTasklet)
                .build();

    }





}

customTasklet.java

구현 클래스에 해당합니다.

package io.springbatch.springbatchlecture.TaskAPI;

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 contribution, ChunkContext chunkContext) throws Exception {
        //이 안에 비즈니스 로직이 들어간다고 생각하면 됨.
        System.out.println("contribution : " + contribution + "chunkContext : " + chunkContext);

        String stepName = contribution.getStepExecution().getStepName();
        String jobName = chunkContext.getStepContext().getJobName();

        System.out.println("==================================");
        System.out.println(stepName + "<- stepName" + jobName + "<- jobName");
        System.out.println("==================================");


        return RepeatStatus.FINISHED;
    }
}

결과

결과 값을 확인하면 1단계와 2단계를 수행한 결과가 표시됩니다.

2023-02-28 13:10:47.555  INFO 12168 --- (           main) i.s.s.SpringbatchApplication             : Started SpringbatchApplication in 2.976 seconds (JVM running for 3.93)
2023-02-28 13:10:47.557  INFO 12168 --- (           main) o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: ()
2023-02-28 13:10:47.724  INFO 12168 --- (           main) o.s.b.c.l.support.SimpleJobLauncher      : Job: (SimpleJob: (name=batchJob)) launched with the following parameters: ({})
2023-02-28 13:10:47.790  INFO 12168 --- (           main) o.s.batch.core.job.SimpleStepHandler     : Executing step: (step1)
stepContribution: (StepContribution: read=0, written=0, filtered=0, readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING)ChunkContext: ChunkContext: attributes=(), complete=false, stepContext=SynchronizedAttributeAccessor: (), stepExecutionContext={batch.taskletType=io.springbatch.springbatchlecture.TaskAPI.TaskletConfiguration$1, batch.stepType=org.springframework.batch.core.step.tasklet.TaskletStep}, jobExecutionContext={}, jobParameters={}
2023-02-28 13:10:47.848  INFO 12168 --- (           main) o.s.batch.core.step.AbstractStep         : Step: (step1) executed in 58ms
2023-02-28 13:10:47.895  INFO 12168 --- (           main) o.s.batch.core.job.SimpleStepHandler     : Executing step: (step2)
contribution : (StepContribution: read=0, written=0, filtered=0, readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING)chunkContext : ChunkContext: attributes=(), complete=false, stepContext=SynchronizedAttributeAccessor: (), stepExecutionContext={batch.taskletType=io.springbatch.springbatchlecture.TaskAPI.customTasklet, batch.stepType=org.springframework.batch.core.step.tasklet.TaskletStep}, jobExecutionContext={}, jobParameters={}
==================================
step2<- stepNamebatchJob<- jobName
==================================
2023-02-28 13:10:47.940  INFO 12168 --- (           main) o.s.batch.core.step.AbstractStep         : Step: (step2) executed in 45ms
2023-02-28 13:10:47.986  INFO 12168 --- (           main) o.s.b.c.l.support.SimpleJobLauncher      : Job: (SimpleJob: (name=batchJob)) completed with the following parameters: ({}) and the following status: (COMPLETED) in 224ms

tasklet이 단계 내에서 작업을 실행하는 것을 볼 수 있습니다.

작업이 수행될 때 빌드 중에 Tasklet이 실행되도록 합니다.