如何使用spring Batch注释将Job参数输入到项目处理器中

时间:2015-07-31 02:34:48

标签: java spring spring-mvc spring-batch spring-batch-admin

我正在使用spring MVC。在我的控制器中,我正在调用jobLauncher,在jobLauncher我正在传递下面的作业参数,我正在使用注释来启用配置,如下所示:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
        // read, write ,process and invoke job
} 

JobParameters jobParameters = new JobParametersBuilder().addString("fileName", "xxxx.txt").toJobParameters();
stasrtjob = jobLauncher.run(job, jobParameters);                              

and here is my itemprocessor                                                         
public class DataItemProcessor implements ItemProcessor<InputData, OutPutData> {

  public OutPutData process(final InputData inputData) throws Exception {

        // i want to get job Parameters here ????

  }

}

2 个答案:

答案 0 :(得分:14)

1)在数据处理器上放置范围注释,即

@Scope(value = "step") 

2)在数据处理器中创建一个类实例,并使用值注释注入作业参数值:

@Value("#{jobParameters['fileName']}")
private String fileName;

您的最终数据处理器类将如下所示:

@Scope(value = "step")
public class DataItemProcessor implements ItemProcessor<InputData, OutPutData> {

@Value("#{jobParameters['fileName']}")
private String fileName;

  public OutPutData process(final InputData inputData) throws Exception {

        // i want to get job Parameters here ????
      System.out.println("Job parameter:"+fileName);

  }

  public void setFileName(String fileName) {
        this.fileName = fileName;
    }


}

如果您的数据处理器未初始化为bean,请在其上放置@Component注释:

@Component("dataItemProcessor")
@Scope(value = "step")
public class DataItemProcessor implements ItemProcessor<InputData, OutPutData> {

答案 1 :(得分:2)

在我看来,避免使用Spring hacky表达式语言(SpEL)的更好解决方案是使用StepExecution@BeforeStep上下文自动连接到处理器中。

在您的处理器中,添加以下内容:

@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
    JobParameters jobParameters = stepExecution.getJobParameters();
    // Do stuff with job parameters, e.g. set class-scoped variables, etc.
}

@BeforeStep批注

  

标记执行Step之前要调用的方法    在创建StepExecution并保留之后,但在第一个之前    已读取项目。