아래와 같이 초기화를 돌리고 다음과 같은 이슈를 발생하였다.
@Configuration
@RequiredArgsConstructor
public class jobBatchResetTest {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job job() {
return jobBuilderFactory.get("batchJob1")
.incrementer(new RunIdIncrementer()) // 동일 파라미터인데 다시 실행하고 싶을때 사용하라는 의미로 RunIdIncrementer를 제공
.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("step1 was executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step2 was executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_STEP_EXECUTION(STEP_EXECUTION_ID, VERSION, STEP_NAME, JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, COMMIT_COUNT, READ_COUNT, FILTER_COUNT, WRITE_COUNT, EXIT_CODE, EXIT_MESSAGE, READ_SKIP_COUNT, WRITE_SKIP_COUNT, PROCESS_SKIP_COUNT, ROLLBACK_COUNT, LAST_UPDATED) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY'
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY'
개선책으로는 아래와 같이 해봤는데도 실패....
1. @SpringBootApplication 주석 후 아래와 같이 진행
@EnableAutoConfiguration(exclude={BatchAutoConfiguration.class})
2. @SpringBootApplication(exclude={BatchAutoConfiguration.class})
결국은 테이블만 날리는것이 아닌 시퀀스들도 초기화를 해주고나서 가능해졌다.
delete from BATCH_JOB_EXECUTION_CONTEXT;
delete from BATCH_JOB_EXECUTION_PARAMS;
delete from BATCH_JOB_EXECUTION_SEQ;
delete from BATCH_JOB_SEQ;
delete from BATCH_STEP_EXECUTION_CONTEXT;
delete from BATCH_STEP_EXECUTION_SEQ;
delete from BATCH_STEP_EXECUTION;
delete from BATCH_JOB_EXECUTION;
delete from BATCH_JOB_INSTANCE;
INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0, '0');
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0, '0');
INSERT INTO BATCH_JOB_SEQ values(0, '0');
※ 시퀀스를 수동으로 넣어야 하는 DB 일 경우 위와 같이 삭제했을 경우 다시 입력해 주어야 합니다.
Postgresql 같은 경우 위와 같은 처리가 필요하지 않습니다.
'SPRING > 기본 상식' 카테고리의 다른 글
[SPRING] 스프링의 트랜잭션 전파 속성(Transaction propagation) (0) | 2023.09.04 |
---|---|
[SPRING] 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유 (0) | 2023.08.29 |
[SPRING] 스프링 배치 아키텍쳐 (0) | 2021.07.20 |
[SPRING] Spring Redis Cache (0) | 2021.07.05 |
[SPRING] Checked Exception Guide (0) | 2021.06.14 |