<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中使用一些重试机制,但是我也希望线程被暂停而不是保持它直到它被重试。
我做了很多研究,似乎无法找到可行的解决方案。任何想法都会有所帮助。谢谢
答案 0 :(得分:0)
根据您的意见,我建议采用略有不同的方法。现在,您的分区方法为每个文件创建一个分区,实质上,它为您提供了一个在当前JobExecution
内执行tasklet的机会。这可以防止您跳过该项并稍后在同一JobExecution
中再次尝试。
相反,我建议使用读写器方法而不是自定义Tasklet
。读者可以根据您传递的资源规范识别需要上传的文件(类似于MultiResourcePartitioner的工作方式)。然后,读者在每次调用ItemReader#read()
时都会返回要读取的下一个文件的名称。然后ItemWriter#write()
将进行上传并将文件标记为在某处上传(将其移至另一个目录,重命名等)。在成功上传并标记为ItemWriter
之前,读者会重新呈现尚未上传到{{1}}的文件。
上述方法可以通过多种方式实现多线程,并防止以不遵循Spring Batch模式的方式暂停和重新启动工作的困难。