Spring 自定义 Tasklet 上的批量重试策略挂起线程

Spring Batch Retry Policy Suspend Thread on Custom Tasklet

<batch:job id="partitionjob">
    <batch:step id="partitionedLoadStep">
        <batch:partition step="task" partitioner="filePartitioner">
            <batch:handler grid-size="10" />
        </batch:partition>
    </batch:step>
</batch:job>

<bean id="filePartitioner"
      class="org.springframework.batch.core.partition.support.MultiResourcePartitioner"
      scope="step">
    <property name="resources" value="file:/SpringBatch/inputFiles/test/test*.txt" />
</bean>

<batch:step id="task">
    <batch:tasklet ref="simpleTasklet"/>
</batch:step>

我正在使用 Spring Batch 进行概念验证。上面的作业将许多文件作为输入,并为每个文件执行 TaskletStep。在上面的 'simpleTasklet' 中,我希望能够在某些资源不可用时挂起当前线程。例如,如果我有 100 个输入文件,前 5 个在资源可用之前无法继续,我仍然希望接下来的 10 个文件继续。我想要 tasklet 中的一些重试机制,但我也希望线程被挂起而不是一直保持到它被重试。

我做了很多研究,但似乎无法找到可行的解决方案。任何想法都会有所帮助。谢谢

根据您的意见,我会提出一种略有不同的方法。现在,您的分区方法为每个文件创建一个分区,这实际上让您有机会在当前 JobExecution 内执行 tasklet。这可以防止您跳过该项目并稍后在同一 JobExecution.

中再次尝试

相反,我建议使用 reader/writer 方法而不是自定义 Tasklet。 reader 将根据您传递的资源规范识别需要上传的文件(类似于 MultiResourcePartitioner 的工作方式)。然后,reader 将在每次调用 ItemReader#read() return 时读取下一个要读取的文件的名称。然后 ItemWriter#write() 将执行上传并将文件标记为已上传到某处(将其移动到另一个目录,重命名等)。 reader 将重新显示尚未上传到 ItemWriter 的文件,直到它们被成功上传并标记为此类。

上述方法可以通过多种方式实现多线程,并防止以不遵循 Spring 批处理模式的方式管理暂停和重新启动工作的困难。