使用 jobParameters return 在 tasklet 和步骤之间传递参数 null
Passing param between tasklet and step using jobParameters return null
我定义了简单的工作。 tasklet 然后 step.
我正在尝试在这两者之间传递文件路径。
当我到达词干时,reader 被调用,在那里 filePath 保持为空。
我错过了什么?
工作配置:
@Bean
public Job processFileJob() throws Exception {
return this.jobs.get("processFileJob").start(downloadFileStep()).next(processor()).build();//.next(pushToKafkaStep()).build();
}
public Step downloadFileStep() {
return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).build();
}
@Bean
protected Tasklet downloadFileTasklet() {
return new DownloadFileTasklet();
}
@Bean
public Step processor() {
return stepBuilderFactory.get("processor")
.<PushItemDTO, PushItemDTO>chunk(1)
.reader(reader(OVERRIDDEN_BY_EXPRESSION))
...
.build();
}
//here filePath always null!!
@Bean
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
public ItemStreamReader<PushItemDTO> reader(@Value("#{jobParameters[filePath]}") String filePath) {
FlatFileItemReader<PushItemDTO> itemReader = new FlatFileItemReader<PushItemDTO>();
itemReader.setLineMapper(lineMapper());
itemReader.setLinesToSkip(1);
itemReader.setResource(new FileSystemResource(filePath));
return itemReader;
}
下载文件任务:
public class DownloadFileTasklet implements Tasklet, StepExecutionListener {
String filePath;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
filePath="someurl";
return RepeatStatus.FINISHED;
}
@Override
public void beforeStep(StepExecution stepExecution) {
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
JobParameters jobParameters = stepExecution.getJobExecution().getJobParameters();
// jobParameters.ad
stepExecution.getExecutionContext().putString("filePath", filePath);
//Return null to leave the old value unchanged.
return null;
}
我在调用此作业时设法直接从 jobLauncher 传递了参数,但是当我尝试在 tasklet 中定义新参数并希望在下一步中使用它时,我将其作为 null
谢谢。
按照建议,我应该使用 ExecutionContextPromotionListener。
所以我在 java 配置中添加了这个:
@Bean
public ExecutionContextPromotionListener executionContextPromotionListener()
{
ExecutionContextPromotionListener executionContextPromotionListener=new ExecutionContextPromotionListener();
executionContextPromotionListener.setKeys(new String[]{"filePath"});
return new ExecutionContextPromotionListener();
}
但是我遇到异常:
Caused by: java.lang.IllegalArgumentException: The 'keys' property must be provided
我通过更改为 return executionContextPromotionListener;
来修复它
然而 filePath 仍然为空。
我也试过这样修改我的 Step 声明:
*添加了executionContextPromotionListener
public Step downloadFileStep() {
return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).listener(executionContextPromotionListener()).build();
}
filePath 参数中仍然为空
将值添加到步骤的 ExecutionContext
使其仅可用于该步骤。为了让另一个步骤可以访问它,您需要将该密钥提升到作业的 ExecutionContext
。为此,请查看 ExecutionContextPromotionListener
。它会将您配置的任何键从当前步骤的 ExecutionContext
提升到作业的 ExecutionContext
,以便可以从其他步骤访问它们。
您可以在此处的文档中阅读有关 ExecutionContextPromotionListener
的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/listener/ExecutionContextPromotionListener.html
我定义了简单的工作。 tasklet 然后 step.
我正在尝试在这两者之间传递文件路径。
当我到达词干时,reader 被调用,在那里 filePath 保持为空。
我错过了什么?
工作配置:
@Bean
public Job processFileJob() throws Exception {
return this.jobs.get("processFileJob").start(downloadFileStep()).next(processor()).build();//.next(pushToKafkaStep()).build();
}
public Step downloadFileStep() {
return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).build();
}
@Bean
protected Tasklet downloadFileTasklet() {
return new DownloadFileTasklet();
}
@Bean
public Step processor() {
return stepBuilderFactory.get("processor")
.<PushItemDTO, PushItemDTO>chunk(1)
.reader(reader(OVERRIDDEN_BY_EXPRESSION))
...
.build();
}
//here filePath always null!!
@Bean
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
public ItemStreamReader<PushItemDTO> reader(@Value("#{jobParameters[filePath]}") String filePath) {
FlatFileItemReader<PushItemDTO> itemReader = new FlatFileItemReader<PushItemDTO>();
itemReader.setLineMapper(lineMapper());
itemReader.setLinesToSkip(1);
itemReader.setResource(new FileSystemResource(filePath));
return itemReader;
}
下载文件任务:
public class DownloadFileTasklet implements Tasklet, StepExecutionListener {
String filePath;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
filePath="someurl";
return RepeatStatus.FINISHED;
}
@Override
public void beforeStep(StepExecution stepExecution) {
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
JobParameters jobParameters = stepExecution.getJobExecution().getJobParameters();
// jobParameters.ad
stepExecution.getExecutionContext().putString("filePath", filePath);
//Return null to leave the old value unchanged.
return null;
}
我在调用此作业时设法直接从 jobLauncher 传递了参数,但是当我尝试在 tasklet 中定义新参数并希望在下一步中使用它时,我将其作为 null
谢谢。
按照建议,我应该使用 ExecutionContextPromotionListener。
所以我在 java 配置中添加了这个:
@Bean
public ExecutionContextPromotionListener executionContextPromotionListener()
{
ExecutionContextPromotionListener executionContextPromotionListener=new ExecutionContextPromotionListener();
executionContextPromotionListener.setKeys(new String[]{"filePath"});
return new ExecutionContextPromotionListener();
}
但是我遇到异常:
Caused by: java.lang.IllegalArgumentException: The 'keys' property must be provided
我通过更改为 return executionContextPromotionListener;
来修复它然而 filePath 仍然为空。
我也试过这样修改我的 Step 声明:
*添加了executionContextPromotionListener
public Step downloadFileStep() {
return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).listener(executionContextPromotionListener()).build();
}
filePath 参数中仍然为空
将值添加到步骤的 ExecutionContext
使其仅可用于该步骤。为了让另一个步骤可以访问它,您需要将该密钥提升到作业的 ExecutionContext
。为此,请查看 ExecutionContextPromotionListener
。它会将您配置的任何键从当前步骤的 ExecutionContext
提升到作业的 ExecutionContext
,以便可以从其他步骤访问它们。
您可以在此处的文档中阅读有关 ExecutionContextPromotionListener
的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/listener/ExecutionContextPromotionListener.html