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