[SPRING] 중복 스프링 배치 작업 인스턴스
SPRING중복 스프링 배치 작업 인스턴스
내가 처음 시작했을 때 잘 작동하는 작은 샘플 스프링 배치 응용 프로그램이 있지만 응용 프로그램을 종료 및 항아리를 다시 시작 할 때마다 나는 항상이 오류가 발생합니다 :
Caused by: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; Duplicate entry '1' for key 1; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 1
내가 설정 잘못 증 분기 직업이 있는지 확실하지 않습니다. 그러나 같은 나는 그것을 시작 및 다음 잘 일괄 처리를 계속 호출하여 웹 서비스 URL, /jobLauncher.html을 사용할 수있다. 그것은 단지 내가 응용 프로그램 종료 & I는이 오류가 다시 시작 후입니다. 그것은 작업 실행 테이블 ID 1을 사용하고 싶어하지만, ID 1은 이전 실행에서 이미 존재한다.
Main 클래스
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, new String[]{ "date=" + System.currentTimeMillis() });
}
}
WebService 클래스
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
@ResponseBody
public String handle() throws Exception{
jobLauncher.run(job, new JobParametersBuilder().addString("date", System.currentTimeMillis() + "").toJobParameters());
return "Started the batch...";
}
}
스프링 배치 클래스
@Configuration
@EnableBatchProcessing
public class SampleBatchApplication {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
protected Tasklet tasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext context) {
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Job job() throws Exception {
return this.jobs.get("job")
.incrementer(new RunIdIncrementer())
.flow(this.step1())
.end()
.build();
}
@Bean
protected Step step1() throws Exception {
return this.steps.get("step1").tasklet(this.tasklet()).build();
}
@Bean
public DataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
try {
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUsername("test");
ds.setPassword("test");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/spring-batch");
} catch (Exception e) {
e.printStackTrace();
}
return ds;
}
}
해결법
-
==============================
1.문제를 발견. 봄 부팅에서 @EnableAutoConfiguration 주석을 사용하는 경우 그것은 '스키마 mysql.sql'파일에서 데이터베이스를 초기화 할 org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration 클래스를 호출합니다.
문제를 발견. 봄 부팅에서 @EnableAutoConfiguration 주석을 사용하는 경우 그것은 '스키마 mysql.sql'파일에서 데이터베이스를 초기화 할 org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration 클래스를 호출합니다.
스키마 mysql.sql 파일 내부 내가 중복 키 오류가 발생 된 이유는 일괄 메타 테이블의 순서 아이디의를 재설정하는 몇 가지 코드는 다음과 같습니다
INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0); INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0); INSERT INTO BATCH_JOB_SEQ values(0);
수정 별도로 스프링 배치 테이블을 구축 및 다음 @EnableAutoConfiguration 주석을 변경했다 :
@EnableAutoConfiguration(exclude={BatchAutoConfiguration.class})
응용 프로그램이 시작될 때 있도록이 스프링 배치 테이블을 초기화하려고하지 않습니다.
http://projects.spring.io/spring-boot/docs/spring-boot-autoconfigure/README.html : 제외하거나 당신이 여기에 몇 가지 문서를 찾을 수있는 다른 구성 요소의 봄 부팅의 자동 구성을 사용자 정의
BatchAutoConfiguration 코드 : https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java
from https://stackoverflow.com/questions/19597683/duplicate-spring-batch-job-instance by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 어떻게 AWS ElasticBeanstalk와의 Nginx에 OAuth2를 사용 나의 봄 부팅 응용 프로그램에 SSL을 강요하는 걸까? (0) | 2019.10.04 |
---|---|
[SPRING] 봄 통합 - HTTP 아웃 바운드 게이트웨이와 POST 매개 변수를 전송하는 방법 (0) | 2019.10.04 |
[SPRING] 봄 보안에 차단 - URL 패턴 주문 (0) | 2019.10.04 |
[SPRING] QueryDsl는 - 어떻게 받는다는와 Q 클래스를 만드는 방법? (0) | 2019.10.04 |
[SPRING] REST API에 대한 JSON 응답에 필드를 제한? (0) | 2019.10.04 |