web-dev-qa-db-fra.com

Comment définir JobParameters dans le lot de printemps avec Spring-Boot

J'ai suivi le guide sur http://spring.io/guides/gs/batch-processing/ mais il décrit un travail sans paramètres configurables. J'utilise Maven pour construire mon projet.

Je porte un travail existant que j'ai défini en XML et je souhaite transmettre les paramètres de travail via la commande.

J'ai essayé ce qui suit:

@Configuration
@EnableBatchProcessing
public class MyBatchConfiguration {

    // other beans ommited

    @Bean 
    public Resource destFile(@Value("#{jobParameters[dest]}") String dest) {
        return new FileSystemResource(dest);
    }

}

Ensuite, je compile mon projet en utilisant:

mvn clean package

Ensuite, j'essaie de lancer le programme comme ceci:

Java my-jarfile.jar dest=/tmp/foo

Et je reçois une exception disant:

[...]
Caused by: org.springframework.expression.spel.SpelEvaluationException: 
EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of 
type 'org.springframework.beans.factory.config.BeanExpressionContext'

Merci !

16
Philippe

J'ai réussi à faire fonctionner cela en annotant simplement mon bean comme suit:

@Bean 
@StepScope
public Resource destFile(@Value("#{jobParameters[dest]}") String dest) {
    return new FileSystemResource(dest);
}
9
Philippe

Analysez les paramètres du travail à partir de la ligne de commande, puis créez et remplissez JobParameters.

public JobParameters getJobParameters() {
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
    jobParametersBuilder.addString("dest", <dest_from_cmd_line);
    jobParametersBuilder.addDate("date", <date_from_cmd_line>);
    return jobParametersBuilder.toJobParameters();
}

Passez-les à votre travail via JobLauncher -

JobLauncher jobLauncher = context.getBean(JobLauncher.class);
JobExecution jobExecution = jobLauncher.run(job, jobParameters);

Maintenant, vous pouvez y accéder en utilisant du code comme -

@Bean 
@StepScope
public Resource destFile(@Value("#{jobParameters[dest]}") String dest) {
    return new FileSystemResource(dest);
}

Ou dans une classe @Configuration qui configure des artefacts de Job Spring Batch comme - ItemReader, ItemWriter, etc ...

@Bean
@StepScope
public JdbcCursorItemReader<MyPojo> reader(@Value("#{jobParameters}") Map jobParameters) {
    return new MyReaderHelper.getReader(jobParameters);
}
15
Ashok