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 Context 및 Step 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
'programing' 카테고리의 다른 글
| ReactJS 부트스트랩네바 및 라우팅이 함께 동작하지 않음 (0) | 2023.02.25 |
|---|---|
| Angular - ng-repeat 순서를 만들 수 없습니다.작업별 (0) | 2023.02.25 |
| AngularJS를 사용하여 url 인코딩 앵커링크를 생성하는 방법 (0) | 2023.02.25 |
| 로그인 후 Spring Boot의 H2 콘솔에 공백 화면이 표시되는 이유는 무엇입니까? (0) | 2023.02.25 |
| 어레이 내의 오브젝트 중 하나를 불변으로 갱신합니다. (0) | 2023.02.25 |