首页 文章

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

提问于
浏览
0

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

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

我正在研究[MultiResourceItemReader] [1]

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

可能吗?

1 回答

  • 3

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

    外部作业应包含所需文件列表的逻辑和决策程序 . batch:job将使用org.springframework.batch.core.step.job.JobParametersExtractor接口调用您的退出作业和作业参数提取器,该接口将所需的文件路径复制到内部作业 .

    看看下面的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创建的文件列表 .

相关问题