기본 사상
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이 실행되도록 합니다.