在春季批处理中从处理器调用另一个作业

时间:2014-10-26 16:26:45

标签: java spring-batch

我有一份工作(= JobA )来读取和处理输入文件 - 这个Job是使用读者,编写器,几个处理器,监听器和异常处理程序定义的,我不想更改此作业定义主要是出于向后兼容性原因

我想实现另一个作业(= JobB ),该作业使用特定条件以特定顺序从目录中读取文件,然后发送要由 JobA处理的文件

我正在研究[MultiResourceItemReader] [1]

[1]:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/MultiResourceItemReader.html“MultiResourceItemReader”但我不知道如何将对 JobA 的调用合并到此

有可能吗?

1 个答案:

答案 0 :(得分:5)

考虑使用第二个作业包装退出作业,并在batch:step元素中使用batch:job元素和job-parameters-extractor。

外部作业应包含所需文件列表的逻辑以及决策程序。 batch:job将使用将复制所需的org.springframework.batch.core.step.job.JobParametersExtractor接口调用您的退出作业和job-parameters-extractor 内部作业的文件路径。

请查看以下我使用上述元素的answer

逻辑上你的工作看起来像

<batch:job id="jobWrapper" incrementer="runIdIncrementer" >
        <batch:step id="createFileList" next="callInternalJob">
            <batch:tasklet ref="fileterRequiredFilesTasklet"/>
        </batch:step>
        <batch:step id="callInternalJob" next="hasMoreFileDecision">
            <batch:job ref="yourJob" job-launcher="jobLauncher"
                job-parameters-extractor="extractCurrentFileParam" />
        </batch:step>
        <batch:decision id="hasMoreFileDecision" decider="hasMoreFileDecider">
            <batch:next on="NEXTFILE" to="callInternalJob" />
            <batch:end  on="COMPLETED" exit-code="COMPLETED" />
        </batch:decision>
    </batch:job>  

fileterRequiredFilesTasklet - 创建所需文件列表并将其存储在作业执行上下文中 callInternalJob - 调用您正在退出的作业并通过callInternalJob将当前文件传递给进程 hasMoreFileDecider - 将循环遍历fileterRequiredFilesTasklet util创建的文件列表,所有这些文件都已处理完毕。