我有一份工作(= JobA )来读取和处理输入文件 - 这个Job是使用读者,编写器,几个处理器,监听器和异常处理程序定义的,我不想更改此作业定义主要是出于向后兼容性原因
我想实现另一个作业(= JobB ),该作业使用特定条件以特定顺序从目录中读取文件,然后发送要由 JobA处理的文件
我正在研究[MultiResourceItemReader] [1]
[1]:http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/MultiResourceItemReader.html“MultiResourceItemReader”但我不知道如何将对 JobA 的调用合并到此
中有可能吗?
答案 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创建的文件列表,所有这些文件都已处理完毕。