복붙노트

[SPRING] 스프링 배치 주석을 사용하여 itemprocessor로 Job 매개 변수를 가져 오는 방법

SPRING

스프링 배치 주석을 사용하여 itemprocessor로 Job 매개 변수를 가져 오는 방법

나는 봄 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 ????

  }

}

해결법

  1. ==============================

    1.1) 데이터 처리기에 스코프 주석을 넣으십시오.

    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> {
    
  2. ==============================

    2.Spring의 hacky expression language (SpEL) 사용을 피하는 더 나은 해결책은 @BeforeStep을 사용하여 StepExecution 컨텍스트를 프로세서에 자동으로 연결하는 것입니다.

    Spring의 hacky expression language (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 주석

  3. from https://stackoverflow.com/questions/31737209/how-to-get-job-parameteres-in-to-item-processor-using-spring-batch-annotation by cc-by-sa and MIT license