반응형
728x90
반응형
기존 구현체 사용
스프링 배치는 동일한 JobParameters 로는 성공한 Job의 재실행이 불가능하다고 했다. 하지만 Job을 여러번 수행시켜야하는 경우도 있으므로 해당 경우에 incrementer()을 사용한다.
기존 구현체인 RunIdIncrementer() 을 사용할 경우 run.id 를 key 값으로 value 가 1씩 증가하여 Job이 실행된다. 계속적으로 증가되는 파라미터가 존재하므로 다른 파라미터 값들은 동일하도 JobParameters 가 다르게 인식되어 재실행이 가능해진다.
- IncrementerConfiguration.java
package com.spring.batch.job;
import com.spring.batch.job.incrementer.CustomJobParametersIncrementer;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
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;
/*
--job.name=incrementerJob
*/
@Configuration
@RequiredArgsConstructor
public class IncrementerConfiguration {
// job 생성
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job incrementerJob() {
return this.jobBuilderFactory.get("incrementerJob")
/* step start */
.start(incrementerStep1())
.next(incrementerStep2())
// 기존 구현체
.incrementer(new RunIdIncrementer())
.build();
}
@Bean
public Step incrementerStep1() {
return stepBuilderFactory.get("incrementerStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("incrementerStep1");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step incrementerStep2() {
return stepBuilderFactory.get("incrementerStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("incrementerStep2");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
스프링 배치에서 제공해주는 기존 구현체의 코드를 보자.
- RunIdIncrementer.java
package org.springframework.batch.core.launch.support;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;
import org.springframework.lang.Nullable;
public class RunIdIncrementer implements JobParametersIncrementer {
// 증가될 key 명
private static String RUN_ID_KEY = "run.id";
private String key;
public RunIdIncrementer() {
this.key = RUN_ID_KEY;
}
public void setKey(String key) {
this.key = key;
}
public JobParameters getNext(@Nullable JobParameters parameters) {
// JobParameters 셋팅
JobParameters params = parameters == null ? new JobParameters() : parameters;
// parameters의 증가될 key 로 value 얻기
JobParameter runIdParameter = (JobParameter)params.getParameters().get(this.key);
long id = 1L;
if (runIdParameter != null) {
try {
// 기존 값의 + 1
id = Long.parseLong(runIdParameter.getValue().toString()) + 1L;
} catch (NumberFormatException var7) {
throw new IllegalArgumentException("Invalid value for parameter " + this.key, var7);
}
}
// 셋팅된 JobParameters로 return
return (new JobParametersBuilder(params)).addLong(this.key, id).toJobParameters();
}
}
직접 Incrementer 만들기
- CustomIncrementer.java
package com.spring.batch.job.incrementer;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* incrementer 구현
*/
public class CustomJobParametersIncrementer implements JobParametersIncrementer {
static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss");
/**
* Date 를 incrementer 로 지정해보자.
* @param jobParameters
* @return
*/
@Override
public JobParameters getNext(JobParameters jobParameters) {
// 해당 날짜-시간으로 설정
String id = format.format(new Date());
return new JobParametersBuilder().addString("run.id", id).toJobParameters();
}
}
- IncrementerConfiguration.java
...
@Bean
public Job incrementerJob() {
return this.jobBuilderFactory.get("incrementerJob")
/* step start */
.start(incrementerStep1())
.next(incrementerStep2())
// 기존 구현체
// .incrementer(new RunIdIncrementer())
// 커스텀 가능
// 항상 변하는 값 이 생겼다. JOB 을 성공해도 해당 JOB은 계속 실행이 가능하다.
// 계속 변하는 값 + 동일한 파라미터 -> JobParameters 가 되므로 다른걸로 인식된다.
.incrementer(new CustomIncrementer())
.build();
}
...
반응형
'Coding > Spring Batch' 카테고리의 다른 글
[SpringBatch] BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION의 EXIT_CODE, STATUS 컬럼 셋팅 정보 (0) | 2022.02.17 |
---|---|
[SpringBatch] COMPLETED된 Step도 Job 재실행 대상에 포함하기 -allowStartIfComplete (0) | 2022.02.15 |
SpringBatch JobLauncherApplicationRunner Job Name 을 지정하여 실행시키기 (동시에 Job 여러개 지정하여 실행시키기) (0) | 2022.01.24 |
SpringBatch에서 JobLauncher 동기/비동기 실행 (0) | 2022.01.21 |
스프링배치 StepContribution (0) | 2022.01.19 |