如何使用spring-boot在spring批处理中设置JobParameters

Phi*_*ppe 15 spring-batch spring-el spring-boot

我按照http://spring.io/guides/gs/batch-processing/上的指南进行了操作,但它描述了一个没有可配置参数的作业.我正在使用Maven来构建我的项目.

我正在移植我在XML中定义的现有作业,并希望通过命令传入jobParameters.

我尝试了以下方法:

@Configuration
@EnableBatchProcessing
public class MyBatchConfiguration {

    // other beans ommited

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

}
Run Code Online (Sandbox Code Playgroud)

然后我使用以下方法编译项目:

mvn clean package
Run Code Online (Sandbox Code Playgroud)

然后我尝试启动这样的程序:

java my-jarfile.jar dest=/tmp/foo
Run Code Online (Sandbox Code Playgroud)

我得到一个例外说:

[...]
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'
Run Code Online (Sandbox Code Playgroud)

谢谢 !

Ash*_*hok 15

从命令行解析作业参数,然后创建并填充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();
}
Run Code Online (Sandbox Code Playgroud)

通过JobLauncher将它们传递给您的工作 -

JobLauncher jobLauncher = context.getBean(JobLauncher.class);
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
Run Code Online (Sandbox Code Playgroud)

现在您可以使用以下代码访问它们 -

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

或者在配置Spring Batch Job工件的@Configuration类中,如ItemReader,ItemWriter等......

@Bean
@StepScope
public JdbcCursorItemReader<MyPojo> reader(@Value("#{jobParameters}") Map jobParameters) {
    return new MyReaderHelper.getReader(jobParameters);
}
Run Code Online (Sandbox Code Playgroud)

  • 但是如果我没有自定义作业启动器怎么办?我只有一份工作,Spring 为我启动了它 (2认同)

Phi*_*ppe 9

我设法通过简单地注释我的bean来实现这个工作,如下所示:

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