JobParametersIncrementer 문의드립니다.
996
작성한 질문수 75
답변 4
1
Job 을 실행하는 주체가 스프링 배치에서 제공하는 JobLauncherApplicationRunner 를 통해 Job 을 자동으로 실행하는 것이 아닌 JobLauncherController 에서 직접 정의한 jobLauncher 를 통해서 하고 있다면 Job 에서 CustomJobParameterIncrementer 를 설정한 부분이 적용되지 않습니다.
즉 스프링 배치가 편의상 제공하는 Incrementer API 는 JobLauncherApplicationRunner 에서 컨트롤 하고 있는 것이며 만약 직접 jobLauncher 를 통해 Job 을 실행한다면 JobParameters 를 생성할 때 run.id 와 같은 구문을 직접 작성해야 합니다.
근데 위의 코드를 보면
JobParameters jobParameters = new JobParametersBuilder()
.addLong("id", member.getId())
.addString("name", member.getName())
.toJobParameters();
이렇게 선언하고 있습니다.
JobParameters 에 저장하는 키와 값을 보면 "id" 와 "name" 이기 때문에 이 값은 Job 을 여러번 실행하더라도 동일한 값으로 저장될 것이기 때문에 중복오류가 발생하는 것입니다.
위 코드에
.addString("run.id", new Date()) 와 같은 구문을 추가해서 Job 이 실행될 때 마다 date 의 값이 다르게 저장되도록 하면 정상적으로 작동하게 됩니다.
한가지 기억하실 점은
jobLauncher.run(job, jobParameters);
으로 실행한 이후에는 더 이상 jobParameters 값을 변경하거나 추가할 수 없고 그 전에 jobParameters 의 설정이 다 마쳐져야 하는데 스프링 배치에서 제공하는 JobLauncherApplicationRunner 에서는 우리가 직접 설정한 CustomJobParameterIncrementer 값을 받아서 기존의 jobParameters 항목에다 추가해서 jobLauncher.run(job, jobParameters) 를 실행하고 있다고 보시면 됩니다.
그렇기 때문에 우리가 직접 jobLauncher 를 컨트롤 해서 실행한다면 Job 의 Incrementer API 는 적용되지 않기 때문에 jobParameters 를 생성할 때 .addString("run.id", new Date()) 처럼 Incrementer 의 로직을 수행하도록 항목을 세팅하시면 됩니다.
0
JobLauncher 강의 설명하실 때, 작성하신 비동기식 동작 소스를 그대로 활용했습니다..
Job 은 강사님 소스와 완전 동일하고요..
@RestController
@RequiredArgsConstructor
public class JobLauncherController {
private final Job job;
private final BasicBatchConfigurer basicBatchConfigurer;
@PostMapping("/execute")
public String executeJob(@RequestBody Member member) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("id", member.getId())
.addString("name", member.getName())
.toJobParameters();
// 비동기식으로 Job수행 처리를 위한 설정
SimpleJobLauncher jobLauncher = (SimpleJobLauncher)basicBatchConfigurer.getJobLauncher();
jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
jobLauncher.run(job, jobParameters);
return "batch success!";
}
}
스프링 배치 버전 질문
0
125
1
소스코드가 어디에 있나요?
0
100
2
트랜잭션 예외
0
92
1
질문이 있습니다.
0
131
2
ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문
0
126
2
여러 JOB 설정하는법
0
152
2
강의 자료 다른 방법 있을까요?
0
157
1
JobExecution과 JobExecutionContext와의 관계
0
188
2
특정 job만 실행
1
256
1
Batch 성능 질문
0
153
1
ItemReaderAdapter 종료
0
81
1
[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader
0
179
2
Spring Batch 배포 질문
0
246
2
spring batch 버전
0
236
2
retry count 관련 질문
0
174
2
StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.
0
331
2
jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)
0
235
2
Multithread step과 AsyncItemProcessor
0
203
2
job 재실행
0
251
2
bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)
0
183
1
Multi-threaded-step과 Partitioning 차이 확인
0
177
2
jdbcCursorReader, jdbcPagingReader 질문
0
146
1
step muti-thread 질문
0
111
1
itemSteam open update close 질문
0
113
1





