반응형
Tasklet
- Tasklet 인터페이스는 execute 단일 메서드를 제공한다.
- Step 내에서 구성되고 실행되는 도메인 객체로 단일 task를 수행하기 위해 사용된다.
- Tasklet은 구현 클래스, 익명 클래스, 사용자 정의 클래스를 통해 실행할 수 있다.
기본 구현 클래스
스프링 배치에서 기본적으로 제공하는 구현체를 사용하는 방식이다.
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// 비즈니스 로직 작성
return RepeatStatus.FINISHED;
}
})
.build();
}
- StepBuilderFactory로부터 step을 얻고 tasklet 메서드를 통해 Tasklet을 생성한다.
- 스프링 배치에서 기본 구현체로부터 오버라이딩하여 내부 로직을 구현할 수 있다.
- 파라미터에는 StepContribution과 ChunkContext 객체가 들어온다.
익명 클래스
기본적으로 제공하는 구현체의 execute() 메서드를 익명 클래스로도 사용할 수 있다.
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.tasklet((contribution, chunkContext) -> {
// 비즈니스 로직 작성
return RepeatStatus.FINISHED;
})
.build();
}
- StepBuilderFactory로부터 step을 얻고 tasklet 메서드를 통해 Tasklet을 익명 클래스로 생성한다.
- 내부 동작 방식은 기본 구현 클래스 사용방식과 일치하며 더욱 간결하게 Tasklet을 구성할 수 있다.
사용자 정의 클래스
Tasklet 인터페이스를 상속받아 직접 execute() 메서드를 구현하여 사용할 수 있다.
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.tasklet(new CustomTasklet())
.build();
}
- 사용자 정의 Tasklet은 해당 객체를 생성하는 것만으로 실행할 수 있다.
- Tasklet 인터페이스의 구현체인 CustomTasklet을 직접 구현해야 한다.
CustomTasklet
public class CustomTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// 비즈니스 로직 작성
return RepeatStatus.FINISHED;
}
}
- Tasklet 인터페이스를 상속받아 Tasklet의 execute() 메서드를 구현하여 사용자 정의 Tasklet을 구성할 수 있다.
Job 실행 결과
BatchJobConfiguration
@Configuration
@RequiredArgsConstructor
public class BatchJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.next(step2())
.next(step3())
.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();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet(new CustomTasklet())
.build();
}
}
CustomTasklet
public class CustomTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step3 was executed");
return RepeatStatus.FINISHED;
}
}
실행결과
2023-06-30 00:13:35.343 INFO 24772 --- [ main] c.e.springbatch.SpringBatchApplication : Started SpringBatchApplication in 2.585 seconds (JVM running for 3.596)
2023-06-30 00:13:35.344 INFO 24772 --- [ main] o.s.b.a.b.JobLauncherApplicationRunner : Running default command line with: [name=user1]
2023-06-30 00:13:35.503 INFO 24772 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=job]] launched with the following parameters: [{name=user1}]
2023-06-30 00:13:35.576 INFO 24772 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
step1 has executed
2023-06-30 00:13:35.620 INFO 24772 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step1] executed in 44ms
2023-06-30 00:13:35.667 INFO 24772 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step2]
step2 has executed
2023-06-30 00:13:35.702 INFO 24772 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step2] executed in 34ms
2023-06-30 00:13:35.744 INFO 24772 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step3]
step3 was executed
2023-06-30 00:13:35.778 INFO 24772 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step3] executed in 34ms
2023-06-30 00:13:35.817 INFO 24772 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=job]] completed with the following parameters: [{name=user1}] and the following status: [COMPLETED] in 277ms
반응형
'프레임워크(Framework) > Spring' 카테고리의 다른 글
[Spring Batch] 스프링 배치 StepContribution 이해하기 - Spring boot 2.x (0) | 2023.07.06 |
---|---|
[Spring Batch] 스프링 배치 StepExecution 이해하기 - Spring boot 2.x (0) | 2023.07.04 |
[Spring Batch] 스프링 배치 Step 이해하기 - Spring boot 2.x (0) | 2023.07.01 |
[Spring Batch] 스프링 배치 JobInstance 이해하기 - Spring boot 2.x (0) | 2023.06.25 |
[Spring Batch] 스프링 배치 Job 이해하기 - Spring boot 2.x (0) | 2023.06.23 |