Duplicate Spring Batch Instância Job

votos
2

Eu tenho uma pequena amostra do aplicativo Spring Batch que quando começou pela primeira vez irá funcionar bem, mas sempre que eu fechar a aplicação para baixo e reiniciar o frasco Eu sempre obter este erro:

Caused by: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT IGNORE  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

Eu não tenho certeza se eu tenho o trabalho incrementador errado configuração. Mas como eu disse eu posso iniciá-lo e, em seguida, usar a URL do serviço web,/jobLauncher.html , para invocar o processo em lote qualquer número de vezes apenas multa. É só depois de eu desligar o aplicativo e reiniciá-lo que eu recebo este erro. Ele quer usar id 1 para a tabela de execução do trabalho, mas id 1 já está lá das execuções anteriores.

classe principal

@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, new String[]{ date= + System.currentTimeMillis() });
    }
}

classe 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...;
    }
}

classe Spring 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;
    }
}
Publicado 25/10/2013 em 20:11
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Encontrei o problema. Ao usar a @EnableAutoConfigurationanotação a partir da Primavera de inicialização que irá invocar a org.springframework.boot.autoconfigure.batch.BatchAutoConfigurationclasse que irá inicializar o banco de dados a partir do arquivo 'esquema mysql.sql'.

Dentro do esquema mysql.sql arquivo é algum código para redefinir a seqüência id para as meta tabelas de lote que é por isso que eu estava ficando um erro de chave duplicada:

INSERT IGNORE  INTO BATCH_STEP_EXECUTION_SEQ values(0);
INSERT IGNORE  INTO BATCH_JOB_EXECUTION_SEQ values(0);
INSERT IGNORE  INTO BATCH_JOB_SEQ values(0);

A correção foi para construir as tabelas de lote Primavera separadamente e, em seguida, mudar a @EnableAutoConfigurationanotação para:

@EnableAutoConfiguration(exclude={BatchAutoConfiguration.class})

de modo que quando o aplicativo é iniciado não irá tentar inicializar as tabelas de lote Primavera.

Para excluir ou personalizar a configuração automática da Primavera de inicialização para outros componentes que você pode encontrar alguns docs aqui: http://projects.spring.io/spring-boot/docs/spring-boot-autoconfigure/README.html

O código BatchAutoConfiguration: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

Respondeu 26/10/2013 em 17:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more