Spring Batch Retry Policy在自定义Tasklet上挂起线程

时间:2015-03-31 18:57:23

标签: multithreading spring-batch

<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中使用一些重试机制,但是我也希望线程被暂停而不是保持它直到它被重试。

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

1 个答案:

答案 0 :(得分:0)

根据您的意见,我建议采用略有不同的方法。现在,您的分区方法为每个文件创建一个分区,实质上,它为您提供了一个在当前JobExecution内执行tasklet的机会。这可以防止您跳过该项并稍后在同一JobExecution中再次尝试。

相反,我建议使用读写器方法而不是自定义Tasklet。读者可以根据您传递的资源规范识别需要上传的文件(类似于MultiResourcePartitioner的工作方式)。然后,读者在每次调用ItemReader#read()时都会返回要读取的下一个文件的名称。然后ItemWriter#write()将进行上传并将文件标记为在某处上传(将其移至另一个目录,重命名等)。在成功上传并标记为ItemWriter之前,读者会重新呈现尚未上传到{{1}}的文件。

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