web-dev-qa-db-ja.com

SpringBatchアノテーションを使用してジョブパラメータをitemprocessorに取り込む方法

SpringMVCを使用しています。コントローラーから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 ????

  }

}
6
Mare

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> {
18
Amit Bhati

Springのハッキー式言語(SpEL)の使用を回避する(私の意見では)より良い解決策は、@BeforeStepを使用してStepExecutionコンテキストをプロセッサに自動配線することです。

プロセッサに、次のようなものを追加します。

@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が作成されて永続化された後、最初の項目が読み取られる前に行われます。

5
heez