Как получить параметры задания в процессоре элементов с помощью аннотации Spring Batch

Я использую 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 ????

  }

}

person Mare    schedule 31.07.2015    source источник


Ответы (2)


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> {
person Amit Bhati    schedule 31.07.2015
comment
если ваш процессор сконфигурирован в XML, вы должны добавить туда область действия, например: ‹bean id=myProcessor class=my.package.MyProcessor scope=step/› - person Asturio; 03.08.2015
comment
Есть ли способ установить пользовательский список типов в параметры задания и получить этот список в обработчике элементов? - person Mare; 04.08.2015
comment
Разве это не должно быть @StepScope, а не @Scope(value = "step")? - person gohil90; 17.01.2018

Лучшее решение (на мой взгляд), которое позволяет избежать использования хакерского языка выражений Spring (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, но до того, как будет прочитан первый элемент.

person heez    schedule 13.12.2018
comment
Проголосовал за - это действительно чистый подход в пакетной версии 1.5.10. - person Michael Peacock; 13.02.2019