programing

Spring Batch에서 ItemReader에서 작업 매개변수에 액세스하는 방법은 무엇입니까?

mailnote 2023. 2. 25. 21:30
반응형

Spring Batch에서 ItemReader에서 작업 매개변수에 액세스하는 방법은 무엇입니까?

이것은 나의 일부분이다.job.xml:

<job id="foo" job-repository="job-repository">
  <step id="bar">
    <tasklet transaction-manager="transaction-manager">
      <chunk commit-interval="1"
        reader="foo-reader" writer="foo-writer"
      />
    </tasklet>
  </step>
</job>

다음은 항목 리더입니다.

import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("foo-reader")
public final class MyReader implements ItemReader<MyData> {
  @Override
  public MyData read() throws Exception {
    //...
  }
  @Value("#{jobParameters['fileName']}")
  public void setFileName(final String name) {
    //...
  }
}

Spring Batch는 다음과 같이 런타임에 표시됩니다.

Field or property 'jobParameters' cannot be found on object of 
type 'org.springframework.beans.factory.config.BeanExpressionContext'

여기 무슨 일 있어?Spring 3.0에서 이러한 메커니즘에 대해 자세히 알아볼 수 있는 곳은 어디입니까?

전술한 바와 같이, 리더는 「스텝」의 스코프를 취득할 필요가 있습니다.이를 수행하려면@Scope("step")주석입니다.다음과 같이 해당 주석을 독자에 추가하면 도움이 됩니다.

import org.springframework.batch.item.ItemReader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("foo-reader")
@Scope("step")
public final class MyReader implements ItemReader<MyData> {
  @Override
  public MyData read() throws Exception {
    //...
  }

  @Value("#{jobParameters['fileName']}")
  public void setFileName(final String name) {
    //...
  }
}

이 스코프는 디폴트로 사용할 수 없습니다.batchXML 네임스페이스그렇지 않은 경우 스프링 구성에 다음 항목을 추가하면 스프링 배치 설명서에 따라 스코프를 사용할 수 있습니다.

<bean class="org.springframework.batch.core.scope.StepScope" />

단일 JavaConfig 클래스에서 인스턴스 및 인스턴스를 정의하는 경우.및 주석을 다음과 같이 사용할 수 있습니다.

@Configuration
public class ContributionCardBatchConfiguration {

   private static final String WILL_BE_INJECTED = null;

   @Bean
   @StepScope
   public FlatFileItemReader<ContributionCard> contributionCardReader(@Value("#{jobParameters['fileName']}")String contributionCardCsvFileName){

     ....
   }

   @Bean
   Step ingestContributionCardStep(ItemReader<ContributionCard> reader){
         return stepBuilderFactory.get("ingestContributionCardStep")
                 .<ContributionCard, ContributionCard>chunk(1)
                 .reader(contributionCardReader(WILL_BE_INJECTED))
                 .writer(contributionCardWriter())
                 .build();
    }
}

이 트릭은 null 값을 itemReader에 전달하는 것입니다.이는 null 값이 iptemReader를 통해 주입되기 때문입니다.@Value("#{jobParameters['fileName']}")주석입니다.

Spring Batch 2.2 – JavaConfig Part 2 : Job Parameters, Execution ContextStep Scope 기사에 대한 Tobias Flohre의 감사

꽤 늦었지만, @BeforeStep 메서드에 주석을 달아 이 작업을 수행할 수도 있습니다.

@BeforeStep
    public void beforeStep(final StepExecution stepExecution) {
        JobParameters parameters = stepExecution.getJobExecution().getJobParameters();
        //use your parameters
}

jobParameters를 사용하려면 판독기를 scope 'step'으로 정의해야 한다고 생각합니다만, 주석을 사용하여 할 수 있을지 모르겠습니다.

xml-config 를 사용하면 다음과 같이 됩니다.

<bean id="foo-readers" scope="step"
  class="...MyReader">
  <property name="fileName" value="#{jobExecutionContext['fileName']}" />
</bean>

자세한 내용은 스프링 배치 설명서를 참조하십시오.

아마 이 기능은@Scopexml-config에서 스텝스코프를 정의합니다.

<bean class="org.springframework.batch.core.scope.StepScope" />

또한 JavaConfig 클래스의 모든 작업 파라미터에 액세스할 수 있습니다.

@Bean
@StepScope
public ItemStreamReader<GenericMessage> reader(@Value("#{jobParameters}") Map<String,Object> jobParameters){
          ....
}

작업 실행 중 Job 파라미터를 다음과 같이 전달해야 합니다.

JobParameters jobParameters= new JobParametersBuilder().addString("file.name", "filename.txt").toJobParameters();   
JobExecution execution = jobLauncher.run(job, jobParameters);  

표현 언어를 사용하여 다음과 같이 값을 가져올 수 있습니다.

 #{jobParameters['file.name']}

이렇게 하는 것이 더 쉬운 방법일 수 있습니다.

@Configuration
@Setter
@StepScope
public  class Reader extends FlatFileItemReader<Object> {

public Reader(@Value("#{jobParameters['filePath']}") String resource){
    setResource(new FileSystemResource(resource));
   }

}

주석이 달린 메서드 내에서 스텝 Execution 컨텍스트를 사용할 수 있습니다.@BeforeStep항목 리더 내의 주석을 사용하여 작업 파라미터를 가져오고 이를 변수로 설정합니다. 변수는 읽기 메서드에서 사용할 수 있습니다.

저 같은 경우는 이렇게 쓰고 있습니다.

@Component
@RequiredArgsConstructor
public class SpelItemReader implements ItemReader<BatchRequest>{

private String requestId;


@Override
public BatchRequest read() {
   //access the request-id variable here
}

@BeforeStep
public void beforeStep(StepExecution stepExecution) {
    requestId = stepExecution.getJobParameters().getString("requestId");
}

}

작업 파라미터가 bean과 같이 맵으로 올바르게 선언되었습니까?

아니면 파일 이름에 대한 getter가 없는 Job Parameters 개체를 실수로 인스턴스화한 것이 아닐까요?

표현 언어에 대한 자세한 내용은 Spring 문서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/6078009/how-to-get-access-to-job-parameters-from-itemreader-in-spring-batch

반응형