복붙노트

[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. ==============================

    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

  2. from https://stackoverflow.com/questions/19597683/duplicate-spring-batch-job-instance by cc-by-sa and MIT license