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) {
//...
}
}
이 범위는 기본적으로 사용할 수 없지만 batch
XML 네임 스페이스를 사용하는 경우 사용할 수 있습니다 . 그렇지 않은 경우 Spring 구성에 다음을 추가하면 Spring Batch 문서에 따라 범위를 사용할 수 있습니다 .
<bean class="org.springframework.batch.core.scope.StepScope" />
단일 JavaConfig 클래스에서 ItemReader
인스턴스와 인스턴스 를 정의하려는 경우 Step
. @StepScope
및 다음 @Value
과 같은 주석을 사용할 수 있습니다 .
@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();
}
}
트릭은 @Value("#{jobParameters['fileName']}")
주석을 통해 주입되므로 itemReader에 null 값을 전달하는 것입니다 .
그의 기사에 대한 Tobias Flohre에게 감사드립니다 : Spring Batch 2.2 – JavaConfig Part 2 : JobParameters, ExecutionContext 및 StepScope
jobParameters를 사용할 수 있으려면 독자를 범위 '단계'로 정의해야한다고 생각하지만 주석을 사용하여 수행 할 수 있는지 확실하지 않습니다.
xml-config를 사용하면 다음과 같이됩니다.
<bean id="foo-readers" scope="step"
class="...MyReader">
<property name="fileName" value="#{jobExecutionContext['fileName']}" />
</bean>
자세한 내용은 Spring Batch 문서를 참조하십시오 .
@Scope
xml-config에서 단계 범위를 사용 하고 정의 하여 작동 할 수 있습니다.
<bean class="org.springframework.batch.core.scope.StepScope" />
Pretty late, but you can also do this by annotating a @BeforeStep method:
@BeforeStep
public void beforeStep(final StepExecution stepExecution) {
JobParameters parameters = stepExecution.getJobExecution().getJobParameters();
//use your parameters
}
Complement with an additional example, you can access all job parameters in JavaConfig class:
@Bean
@StepScope
public ItemStreamReader<GenericMessage> reader(@Value("#{jobParameters}") Map<String,Object> jobParameters){
....
}
While executing the job we need to pass Job parameters as follows:
JobParameters jobParameters= new JobParametersBuilder().addString("file.name", "filename.txt").toJobParameters();
JobExecution execution = jobLauncher.run(job, jobParameters);
by using the expression language we can import the value as follows:
#{jobParameters['file.name']}
Did you declare the jobparameters as map properly as bean?
Or did you perhaps accidently instantiate a JobParameters object, which has no getter for the filename?
For more on expression language you can find information in Spring documentation here.
'Programing' 카테고리의 다른 글
댓글없이 Subversion 커밋을 방지하려면 어떻게해야합니까? (0) | 2020.11.18 |
---|---|
"#! / usr / bin / env python"을 사용하여 python에 인수를 전달할 수 없습니다. (0) | 2020.11.18 |
새 속성을 동적으로 만드는 방법 (0) | 2020.11.18 |
Haskell 운영자에게 허용되는 문자는 무엇입니까? (0) | 2020.11.18 |
C 및 C ++ : 자동 구조의 부분 초기화 (0) | 2020.11.18 |