【问题标题】:How do I set JobParameters in spring batch with spring-boot如何使用spring-boot在spring批处理中设置JobParameters
【发布时间】:2014-02-28 17:24:45
【问题描述】:

我按照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);
    }

}

然后我使用以下代码编译我的项目:

mvn clean package

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

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

我得到一个例外说:

[...]
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'

谢谢!

【问题讨论】:

  • 首先如何设置参数?即jobParameters[dest] 是如何填充的?
  • 好吧,只需使用 JobParametersBuilder().addString("dest", args[0]).toJobParameters() 在可执行 jar 文件的主类中创建 JobParameters,然后传递结果JobParameters 到 JobLauncher。见docs.spring.io/spring-batch/reference/htmlsingle/…

标签: spring-batch spring-el spring-boot


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的好建议。请让我知道我们如何使用 DefaultBatchConfigurer 做同样的事情?
  • 但是如果我没有自定义作业启动器怎么办?我只有一份工作,春天开始为我工作
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2018-10-22
    • 2018-10-14
    • 2020-11-19
    相关资源
    最近更新 更多