当前位置: 首页 > 知识库问答 >
问题:

使用jobParameters在tasklet和步骤之间传递参数返回null

田易安
2023-03-14

我定义了简单的工作。tasklet然后步骤。

我正在尝试在这两者之间传递filePath。

当我到达stem时,会调用读取器,在那里,文件路径保持为null。

我错过了什么?

职位配置:

@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

谢谢你。

正如推荐的那样,我应该使用ExecutionContextPubltionListener。

因此,我在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仍然为null。

我还尝试通过以下方式修改步骤声明:

*添加了执行上下文促销监听器

public Step downloadFileStep() {
    return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).listener(executionContextPromotionListener()).build();
}

filePath参数仍然为空

共有1个答案

陈功
2023-03-14

向步骤的执行上下文(ExecutionContext)添加一个值,使其仅对该步骤可用。为了使它能够被另一个步骤访问,您需要将该键提升到作业的执行上下文(ExecutionContext)。为此,请查看ExecutionContextPromotionListener。它将把您配置的任何键从当前步骤的执行上下文升级到作业的执行上下文,以便可以从其他步骤访问它们。

您可以在以下文档中阅读有关ExecutionContextPromotionListener的更多信息:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/listener/ExecutionContextPromotionListener.html

 类似资料:
  • 问题内容: 为了在步骤之间传递变量,我有步骤方法属于同一类,并使用该类的字段作为传递的信息。 下面是一个示例,如下所示: 带有步骤定义的Java类: 我的问题是在步骤之间共享信息是否是一个好习惯?或者将功能定义为: 问题答案: 为了在步骤之间共享共同点,您需要使用World。在Java中,它没有在Ruby中那么清晰。 引用黄瓜的创建者。 “世界”的目的是双重的: 隔离方案之间的状态。 在场景中的步

  • 我试图将参数从tasklet安全地传递到同一工作中的一个步骤。 我的工作包括三个小任务(step1、step2、step3),一个接一个,最后是step4(处理器、阅读器、写入器) 这项工作正在并行执行多次。 在tasklet的第1步中,我通过web服务评估param(hashId),然后将其传递到整个链,直到我的阅读器(第4步) 在步骤3中,我创建了一个名为: filePath的新参数,它基于h

  • 本文向大家介绍vue v-on:click传递动态参数的步骤,包括了vue v-on:click传递动态参数的步骤的使用技巧和注意事项,需要的朋友参考一下 最近项目中要为一个循环列表动态传送当前点击列的数据,查了很久资料也没有一个完美的解决方案, 新手只能用vue的事件处理器与jquery的选择器做了一个不伦不类的方案,居然也能解决这个问题,作此记录留待以后会有更好的方法解决这个事情 需求:根据每

  • 本文向大家介绍Swift传递和返回函数,包括了Swift传递和返回函数的使用技巧和注意事项,需要的朋友参考一下 示例 以下函数返回另一个函数作为其结果,可以稍后将其分配给变量并调用:            

  • 我有一个变量,我想在所有步骤中传递这个变量。任何人都可以通过代码片段示例建议如何在步骤之间传递变量值。任何帮助将不胜感激。