从步骤之前的xml配置Spring批处理中获取jobExecutionContext

disho6za  于 2023-01-12  发布在  Spring
关注(0)|答案(1)|浏览(118)

我将按以下方式定义我的MultiResourceItemReader

<bean id="multiDataItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
        <property name="resources" value="#{jobExecutionContext['filesResource']}"/>
        <property name="delegate" ref="dataItemReader"/>
</bean>

您可以看到,我希望从jobExecutionContext读取“filesResource”值。
注:我改变了一些名字,以保持“代码隐私”。这是执行,是有人想要更多的信息请告诉我。
我在第一步中保存了这个值,在第二步中使用了读取器,我应该访问它吗?
我将它保存在step1任务的最后几行中:

ExecutionContext jobContext = context.getStepContext().getStepExecution().getJobExecution().getExecutionContext(); 
    jobContext.put("filesResource", resourceString); 

<batch:job id="myJob">

    <batch:step id="step1" next="step2">
        <batch:tasklet ref="moveFilesFromTasklet" />
    </batch:step>

    <batch:step id="step2">
        <tasklet>
            <chunk commit-interval="500" 
                reader="multiDataItemReader" 
                processor="dataItemProcessor" 
                writer="dataItemWriter" />
        </tasklet>
    </batch:step>

</batch:job>

我不确定我忘记了什么来得到这个值。我得到的错误是:

20190714 19:49:08.120 WARN   org.springframework.batch.item.file.MultiResourceItemReader [[ # ]] - No resources to read. Set strict=true if this should be an error condition.
yeotifhr

yeotifhr1#

我看不出你的配置有什么问题。resourceString的值应该是org.springframework.core.io.Resource的数组,因为这是MultiResourceItemReaderresources属性的参数类型。
你可以传递一个String的数组或列表,并带有每个资源的绝对路径,它应该可以工作。

class MyTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        List<String> resources = Arrays.asList(
                "/full/path/to/resource1",
                "/full/path/to/resource2");
        chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext()
                .put("filesResource", resources);
        return RepeatStatus.FINISHED;
    }

}

相关问题