๐ Job, JobInstance, JobParameters, JobExecution
์ง๋ ์๊ฐ์๋ Spring Batch์ Meta Data Schema์ ๋ํด ์ดํด๋ณด์์ต๋๋ค.
์ด๋ฒ ์๊ฐ์๋ Job์ ์ฌ๋ฌ ๋๋ฉ์ธ ๊ฐ์ฒด์ธ JobInstance, JobParameters, JobExecution ๊ฐ์ฒด์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
(์์ ์ฝ๋๋ GitHub์์ ํ์ธํ ์ ์์ต๋๋ค. ๐)
๐ ํด๋น ํฌ์คํ ์ ๋ชฉํ
- Spring Batch Job
- Spring Batch JobInstance
- Spring Batch JobParameters
- Spring Batch JobExecution
๐ Job
๊ธฐ๋ณธ ๊ฐ๋
- ๋ฐฐ์น ๊ณ์ธต ๊ตฌ์กฐ์์ ์ต์์์ ๊ฐ๋ ์ผ๋ก ์ ์ฒด ๋ฐฐ์น ํ๋ก์ธ์ค๋ฅผ ์บก์ํํ ์ํฐํฐ
- Job Configuration์ ํตํด ์์ฑ๋๋ ๊ฐ์ฒด ๋จ์๋ก ๋ฐฐ์น ์์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ ์คํํ ์ง ๋ช ์ธํด ๋์ ๊ฐ์ฒด
- ์ฌ๋ฌ Step๋ค์ ํฌํจํ๋ ์ปจํ ์ด๋๋ก ๋ฐ๋์ ํ ๊ฐ ์ด์์ Step์ผ๋ก ๊ตฌ์ฑํด์ผ ํจ
๊ธฐ๋ณธ ๊ตฌํ์ฒด
AbstractJob
Job์ ๊ตฌํํ๊ณ ์๋ ์ถ์ ํด๋์ค๋ก ์ฌ๋ฌ ํ๋ ๋ฐ ๋ฉ์๋๋ค์ด ์กด์ฌํฉ๋๋ค.
- name: Job ์ด๋ฆ
- restartable: Job์ ์ฌ์์ ์ฌ๋ถ(default = true)
- JobRepository: ๋ฉํ ๋ฐ์ดํฐ ์ ์ฅ์
- JobExecutionListener: Job์ ์ด๋ฒคํธ ๋ฆฌ์ค๋
- JobParametersIncrementer: JobParameters ์ฆ๊ฐ๊ธฐ
- JobParametersValidator: JobParameters ๊ฒ์ฆ๊ธฐ
- StepHandler: Step ์คํ ํธ๋ค๋ฌ
SimpleJob
- ์์ฐจ์ ์ผ๋ก Step์ ์คํ์ํค๋ Job
- ๋ชจ๋ Job์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ์ค ๊ธฐ๋ฅ์ ํฌํจ
FlowJob
- ํน์ ์กฐ๊ฑด ๋ฐ ํ๋ฆ์ ๋ฐ๋ผ Step์ ๊ตฌ์ฑํ์ฌ ์คํํ๋ Job
- Flow ๊ฐ์ฒด๋ฅผ ์คํ์์ผ ์์ ์ ์งํ
๐ JobInstance
๊ธฐ๋ณธ ๊ฐ๋
- Job์ด ์คํ๋๋ ์์ ์์ ์์ฑ๋๋ Job์ ๋ ผ๋ฆฌ์ ์์ ์คํ ๊ฐ๋
- Job์ด ์คํ๋๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ด์ฉ์ ๊ฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Job์ ์คํ์ ๊ตฌ๋ถํด์ผ ํจ
- ์๋ฅผ ๋ค์ด, ํ๋ฃจ์ ํ ๋ฒ ๋งค์ผ Job์ด ์คํ๋๋ค๋ฉด, ์คํ๋๋ ๊ฐ๊ฐ์ Job์ JobInstance๋ผ๊ณ ํจ
- ์ฒ์ ์์ํ๋ Job & JobParameters์ ๊ฒฝ์ฐ ์๋ก์ด JobInstance๋ฅผ ์์ฑ
- ์ด์ ๊ณผ ๋์ผํ Job & JobParameters์ผ๋ก ์คํํ ๊ฒฝ์ฐ ์ด๋ฏธ ์กด์ฌํ๋ JobInstance๋ฅผ ๋ฆฌํด
- Meta Data Schema์ BATCH_JOB_INSTANCE ํ ์ด๋ธ๊ณผ ๋งคํ
JobInstance ๊ณผ์
(์ฐธ๊ณ : ์ธํ๋ฐ Spring Batch)
JobLauncher๋ ์ค์ Batch Job์ ์คํ์ํค๋ Launcher๋ก Job์ ์คํํ ๋(run) Job, JobParameters ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์์ Spring Batch Job์ ์คํํฉ๋๋ค.
์ ์ฌ์ง์ฒ๋ผ Job = ์ผ๋ณ ์ ์ฐ, JobParameters = '2021.01.01' ์ด๋ผ๋ ์ธ์๋ฅผ ๋ฐ์ Job์ ์คํํ๋ค๊ณ ํ์ ๋, JobRepository๋ผ๋ ํด๋์ค(๋ฉํ ๋ฐ์ดํฐ์ ์ ์ฅ์ ์ญํ )๊ฐ Job & JobParameters๋ฅผ Key๋ก ํด์ ์ด์ ์ ์คํํ ๋ด์ญ์ด ์กด์ฌํ๋์ง DB์์ ์กฐํํฉ๋๋ค.
Job & JobParameters๋ก ์กฐํ ํ JobInstance๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ, ๊ธฐ์กด JobInstance๋ฅผ ๋ฆฌํดํ๊ณ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์๋ก์ด JobInstance๋ฅผ ์์ฑํฉ๋๋ค.
(JobParameters๋ Spring Batch๊ฐ ์คํ๋ ๋ ์ธ๋ถ์์ ๋ฐ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฏธํ๋๋ฐ์, ๋ค์์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.)
์์ ์ฝ๋
(์ฝ๋ ํธ์ ์ import๋ ๋ชจ๋ ์ ์ธํ์ต๋๋ค.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | @RequiredArgsConstructor @Configuration public class JobInstanceConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job instanceBatchJob() { return this.jobBuilderFactory.get("Job") .start(instanceStep1()) .next(instanceStep2()) .build(); } @Bean public Step instanceStep1() { return stepBuilderFactory.get("instanceStep1") .tasklet((contribution, chunkContext) -> { JobInstance jobInstance = contribution.getStepExecution().getJobExecution().getJobInstance(); System.out.println("jobInstance.getId() : " + jobInstance.getId()); System.out.println("jobInstance.getInstanceId() : " + jobInstance.getInstanceId()); System.out.println("jobInstance.getJobName() : " + jobInstance.getJobName()); System.out.println("jobInstance.getJobVersion : " + jobInstance.getVersion()); return RepeatStatus.FINISHED; }) .build(); } @Bean public Step instanceStep2() { return stepBuilderFactory.get("instanceStep2") .tasklet((contribution, chunkContext) -> { System.out.println("step2 has executed"); return RepeatStatus.FINISHED; }) .build(); } } | cs |
ํ๋์ Job๊ณผ 2๊ฐ์ Step์ ๊ฐ์ง๋ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์์ ๊ฐ์ด ์์ฑํด ์ฃผ์์ต๋๋ค.
JobInstance๋ StepContribution ๊ฐ์ฒด๋ก๋ถํฐ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Component
public class JobRunner implements ApplicationRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
public void run(ApplicationArguments args) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "JuHyun")
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}
JobParameters ํ์ธ์ ์ํด ์ค์ JobLauncher๋ฅผ ํตํด ์์์ ์์ฑํ Batch Job์ ์คํ์ํค๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
spring:
batch:
job:
enabled: false
---
spring.batch.job.enabled=false
๊ทธ ํ application.yml ํ์ผ์ Spring Boot๊ฐ ์๋์ผ๋ก ์คํํ๋ Job ์ค์ ์ false๋ก ์ค์ ํฉ๋๋ค.
์ ์ฝ๋๋ฅผ ์์ฑํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด๋ณด๋ฉด Job์ด ์ ์์ ์ผ๋ก ์คํ์ด ๋๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ์ด ๋ฉ๋๋ค.
๋์ผํ ์ฝ๋ ๋ฐ JobParameters๋ก ๋ ๋ฒ์งธ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์๋ฌ์ ํจ๊ป ๋ฐฐ์น ์คํ์ด ์คํจํ๊ฒ ๋ฉ๋๋ค.
์๋ฌ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํด ๋ณด๋ฉด JobInstance๊ฐ ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค๊ณ ๋์์๊ณ , Job์ ๋ค์ ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ parameters๋ฅผ ๋ณ๊ฒฝํ๋ผ๊ณ ๋์์๊ธฐ ๋๋ฌธ์ JobParameters๋ฅผ ๋ณ๊ฒฝํ ํ ๋ค์ ์คํํด ๋ณด๋ฉด ์ ์์ ์ผ๋ก ์ฑ๊ณตํฉ๋๋ค.
๐ JobParameters
๊ธฐ๋ณธ ๊ฐ๋
- Spring Batch์ Job์ ์คํํ ๋ ์ธ๋ถ์์ ๋ฐ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ๋๋งค์ธ ๊ฐ์ฒด
- ํ๋์ Job์ ์กด์ฌํ ์ ์๋ ์ฌ๋ฌ๊ฐ์ JobInstance๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ฉ๋
- JobInstance์ JobParameters๋ 1:1 ๊ด๊ณ
- Meta Data Schema์ BATCH_JOB_EXECUTION_PARAM ํ ์ด๋ธ๊ณผ ๋งคํ
์์ฑ ๋ฐ ๋ฐ์ธ๋ฉ
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ฃผ์ : java -jar ~.jar -requestDate=20210101
- ์ฝ๋๋ก ์์ฑ : JobParameterBuilder
- SPEL ์ฌ์ฉ : @Value(“#{jobParameter[requestDate]}”) - @JobScope, @StepScope ์ ์ธ์ด ํ์
- @JobScope, @StepScope๋ Job, Step์ด ์คํ๋๋ ์์ ์ Bean์ด ์์ฑ๋๋๋ก Bean์ ์์ฑ์์ ์ ์ง์ฐ์ํค๋ ์ญํ ์ ํฉ๋๋ค. @Value ์ด๋ ธํ ์ด์ ์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋ ๋ฐ์ธ๋ฉ์ ํ๊ธฐ ๋๋ฌธ์ @JobScope, @Stepcope ์ด๋ ธํ ์ด์ ์ด ์กด์ฌํ์ง ์์ผ๋ฉด NullPointerException ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์์ ์ฝ๋ 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | @RequiredArgsConstructor @Configuration public class JobParameterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Primary @Bean public Job BatchJob() { return this.jobBuilderFactory.get("JobParameters") .start(step1()) .next(step2()) .build(); } @Bean public Step step1() { return stepBuilderFactory.get("JobParametersStep1") .tasklet((contribution, chunkContext) -> { JobParameters jobParameters = contribution.getStepExecution().getJobParameters(); String name = jobParameters.getString("name"); Long seq = jobParameters.getLong("seq"); Date date = jobParameters.getDate("date"); System.out.println("==========================="); System.out.println("name: " + name); System.out.println("seq: " + seq); System.out.println("date: " + date); System.out.println("==========================="); Map<String, Object> jobParameters2 = chunkContext.getStepContext().getJobParameters(); String name2 = (String) jobParameters2.get("name"); long seq2 = (long) jobParameters2.get("seq"); System.out.println("name: " + name2); System.out.println("seq: " + seq); System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } @Bean public Step step2() { return stepBuilderFactory.get("JobParametersStep2") .tasklet((contribution, chunkContext) -> { System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Component public class JobParameterTest implements ApplicationRunner { @Autowired JobLauncher jobLauncher; @Autowired Job job; @Override public void run(ApplicationArguments args) throws Exception { JobParameters jobParameters = new JobParametersBuilder().addString("name", "JuHyuns") .addLong("seq", 1L) .addDate("date", new Date()) .toJobParameters(); jobLauncher.run(job, jobParameters); } } | cs |
์ ์์ ์ฝ๋์์ contribution์ ์ด์ฉํ์ฌ JobParameters๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
JobParameters jobParameters = contribution.getStepExecution().getJobParameters();
contribution์ StepContribution ํด๋์ค์ด๊ณ , StepContribution ํด๋์ค ๋ด๋ถ์ StepExecution ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ํ StepExecution ํด๋์ค ๋ด๋ถ์๋ JobExecution๋ผ๋ ํ๋๊ฐ ์กด์ฌํ๊ณ , ์ต์ข ์ ์ผ๋ก JobExecution ํด๋์ค ๋ด์ JobParameters ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ JobParameters๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ด ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
StepContribution -> StepExecution -> JobExecution (JobParameters)
๋ํ chunkContext๋ฅผ ํตํด์๋ JobParameters๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
Map<String, Object> jobParameters2 = chunkContext.getStepContext().getJobParameters();
contribution์๋ ๋ค๋ฅด๊ฒ ํ์ ์ด JobParameters์ด ์๋ ์๋ Map ํ์์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ธ StepContribution ๊ฐ์ฒด๋ฅผ ํตํด JobParameters๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ณด๋ค ์ข์ ๋ฐฉ๋ฒ์ผ ๋ฏํฉ๋๋ค.
์์ ์ฝ๋ 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @RequiredArgsConstructor @Configuration public class JobParameterConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Primary @Bean public Job batchJob() { return this.jobBuilderFactory.get("JobParameters") .start(step1(null)) .next(step2()) .build(); } @Bean @JobScope // Scope ์ถ๊ฐ(์ง์ฐ ์ด๊ธฐํ) public Step step1(@Value("#{jobParameters[requestDate]}") String requestDate) { return stepBuilderFactory.get("JobParametersStep1") .tasklet((contribution, chunkContext) -> { System.out.println("======================="); System.out.println("requestDate: " + requestDate); System.out.println("======================="); return RepeatStatus.FINISHED; }) .build(); } @Bean public Step step2() { return stepBuilderFactory.get("JobParametersStep2") .tasklet((contribution, chunkContext) -> { System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } } | cs |
๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ฝ๋ 1๊ณผ ๋น์ทํ์ง๋ง, SPEL ์ ์ฉ์ ์ํด step๋ฉ์๋์ ์๋จ์ @JobScope ์ด๋ ธํ ์ด์ ๊ณผ ๋ฉ์๋ ์ธ์์ @Value ์ด๋ ธํ ์ด์ ์ ํตํด JobParameters์ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด Edit Configurations > Modify options > Program arguments๋ฅผ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ ํ Spring Batch Job์ ์คํํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ๊ฐ์ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก JobLauncher๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ Batch๋ฅผ ์คํํ๋ ค๋ฉด application.yml ํ์ผ์์ ์๋์ ๊ฐ์ด ์ค์ ์ ํ๋ฉด ๋ฉ๋๋ค.
spring:
batch:
job:
enabled: true
names: JobParameters
profiles:
active: local
JobParameters๋ฅผ ์ธ๋ถ์์ ์ ๋ฌ๋ฐ์์ผ๋ก์จ ์ป๋ ์ด์ ์ ๊ต์ฅํ๋ฐ์, ํน์ ๊ฐ์ ๋ฐ๋ผ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ด๋ถ ๋ก์ง ๋ฑ์ ์๋ ์์์ ๊ฐ์ ๊ฒฝ์ฐ ๊ต์ฅํ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
- ๋ ์ง๋ณ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- Spring Batch Job์ ์คํ ์ฃผ์ฒด๊ฐ Jenkins๋ก ๊ด๋ฆฌ๋ ๊ฒฝ์ฐ, Jenkins ๋น๋ ์ ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํด์ผ ํ ๊ฒฝ์ฐ
- ์ธํฐํ์ด์ค์ ํ์ ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ก์ง, ๊ฒฝ๋ก ๋ฑ์ด ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ
๐ JobExecution
๊ธฐ๋ณธ ๊ฐ๋
- JobExecution์ Job์ ๋ํ ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด๋ก Job ์คํ ์ค ๋ฐ์ํ ์ ๋ณด๋ค์ ์ ์ฅํ๊ณ ์๋ ๊ฐ์ฒด
- ์์ ์๊ฐ, ์ข ๋ฃ ์๊ฐ, ์ํ, ์ข ๋ฃ ์ํ ๋ฑ์ ์ ๋ณด
- JobInstance์์ ๊ด๊ณ
- JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'COMPLETED' -> Job ์ฌ ์คํ ๋ถ๊ฐ๋ฅ
- JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'FAILED' -> Job ์ฌ ์คํ ๊ฐ๋ฅ
- JobExecution์ ์คํ ์ํ ๊ฒฐ๊ณผ๊ฐ 'COMPLETED'๊ฐ ๋ ๋๊น์ง ํ๋์ JobInstance ๋ด์์ ์ฌ๋ฌ ๋ฒ ์๋ ๊ฐ๋ฅ
- JobInstance์ JobExecution๋ 1 : N์ ๊ด๊ณ
- BATCH_JOB_EXECUTION ํ ์ด๋ธ๊ณผ ๋งคํ
JobExecution ๊ณผ์
(์ฐธ๊ณ : ์ธํ๋ฐ Spring Batch)
- JobLauncher๊ฐ Batch Job์ ์คํ(Job & JobParameters)
- JobRepository๊ฐ Job & JobParameters๋ก DB ์กฐํ
- JobInstance๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ๊ธฐ์กด JobInstance๋ฅผ ๋ฆฌํด, ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์๋ก์ด JobInstance๋ฅผ ๋ฆฌํด
- JobInstance๊ฐ ์์ฑ๋๋ฉด JobExecution๋ ์๋ก ์์ฑ๋จ
- ์ด๋ฏธ ์กด์ฌํ๋ JobInstance์์ BatchStatus์ ์กฐ๊ฑด์ ๋ฐ๋ผ Job์ ์ฌ ์คํ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ
์์ ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @RequiredArgsConstructor @Configuration public class JobExecutionConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Primary @Bean public Job executionJob() { return this.jobBuilderFactory.get("JobExecution") .start(executionStep1()) .next(executionStep2()) .build(); } @Bean public Step executionStep1() { return stepBuilderFactory.get("JobExecutionStep1") .tasklet((contribution, chunkContext) -> { JobExecution jobExecution = contribution.getStepExecution().getJobExecution(); System.out.println("jobExecution = " + jobExecution); System.out.println("step1 has executed"); return RepeatStatus.FINISHED; }) .build(); } @Bean public Step executionStep2() { return stepBuilderFactory.get("JobExecutionStep2") .tasklet((contribution, chunkContext) -> { // throw new RuntimeException("JobExecution has failed"); System.out.println("step2 has executed"); return RepeatStatus.FINISHED; }) .build(); } } | cs |
์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ Batch Job์ ์คํํด๋ณด๋ฉด ์ ์์ ์ผ๋ก ์คํ๋๊ณ ์ํ๊ฐ COMPLETED๋ก ์ ์ฅ์ด ๋ฉ๋๋ค.
...
@Bean
public Step executionStep2() {
return stepBuilderFactory.get("JobExecutionStep2")
.tasklet((contribution, chunkContext) -> {
throw new RuntimeException("JobExecution has failed"); // ์์ธ ๋ฐ์
})
.build();
}
์ ์ฝ๋์ฒ๋ผ step์์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ๋ฐ์์์ผ ๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ์๋ Batch Job์์ ์์ธ๊ฐ ๋ฐ์ํ์ฌ ์ํ๊ฐ FAILED๋ก ๊ธฐ๋ก์ด ๋ฉ๋๋ค.
๋ง์ฝ ์ ์ํ์์ ๋์ผํ JobParameters๋ก ์คํํด๋ณด๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
JobInstacne๋ ๊ทธ๋๋ก์ง๋ง JobExecution๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ JobInstance๊ฐ ์กด์ฌํ๋๋ผ๋, Status๊ฐ FAILED์ผ ๊ฒฝ์ฐ ๊ณ์ํด์ Job์ ์คํํ ์ ์์ต๋๋ค. ๋ํ JobInstance์ JobExecution์ ๊ด๊ณ๋ 1 : N์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์์์ ๊ฐ์ ๋ก ์์ธ ๋ฐ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ Batch Job์ ์ ์์ ์ผ๋ก ์คํ๋๋๋ก ์์ ํ์ฌ ํ ์คํธํด๋ณด๋ฉด ์ํ๊ฐ COMPLETED๋ก ์ ์ฅ์ด ๋๊ณ , ์ดํ์๋ ๋์ผํ JobInstance๋ก Job์ ์คํํ๋ ๊ฑด ๋ถ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ฌธ์
'Spring > Spring Batch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Batch (6) ExecutionContext (0) | 2022.11.05 |
---|---|
Spring Batch (5) Step, StepExecution (0) | 2022.11.03 |
Spring Batch (3) DB ์คํค๋ง (0) | 2022.10.30 |
Spring Batch (2) ํ๋ก์ ํธ ๊ตฌ์ฑ ๋ฐ ์์กด์ฑ ์ค์ , Hello World (0) | 2022.10.29 |
Spring Batch (1) ๊ฐ์ (0) | 2022.10.28 |
๋๊ธ