如何使用spring批处理注解将作业参数导入项目处理器

6ie5vjzr  于 2022-10-31  发布在  Spring
关注(0)|答案(3)|浏览(135)

我正在使用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 ????

  }

}
h5qlskok

h5qlskok1#

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> {
bejyjqdl

bejyjqdl2#

在我看来,避免使用Spring的hacky表达式语言(SpEL)的一个更好的解决方案是使用@BeforeStepStepExecution上下文自动连接到处理器中。
在您的处理器中,添加以下内容:

@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之后,但在读取第一个项目之前。

vlju58qv

vlju58qv3#

我已经在进程本身中编写了,而不是使用lambda表达式创建单独的文件。

@Bean
    @StepScope
    public ItemProcessor<SampleTable, SampleTable> processor(@Value("#{jobParameters['eventName']}") String eventName) {
        //return new RandomNumberProcessor();

        return item -> {
            SampleTable dataSample = new SampleTable();
            if(data.contains(item)) {
                return null;
            }
            else {
                dataSample.setMobileNo(item.getMobileNo());
                dataSample.setEventId(eventName);
                return dataSample;
            }
        };
    }

相关问题