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 批处理模式的方式管理暂停和重新启动工作的困难。
<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 批处理模式的方式管理暂停和重新启动工作的困难。