Spring Partitioner 重启问题中的 Batch FlowStep
Spring Batch FlowStep in Partitioner restart issue
这是我试图在 Spring 批处理作业中实现的目标:
- 分区程序启动 FlowStep
- FlowStep 由 n 个步骤组成
- 万一失败,我想要内部步骤的一致重启
我在重启过程中遇到以下问题:
假设我有 2 个分区,为了简单起见,我有一个 syncTaskExecutor。第一个分区(partition0)运行好了,我们现在运行第二个分区(partition1)。
第一个问题是 FlowStep 的子步骤被检测为重复。这是因为子步骤的名称没有以分区索引为后缀。不过步骤运行少不了。
如果一个子步骤失败,就会发生这种情况。那样的话,在重启时,由于partition0执行的所有子步骤都成功退出,partition1的剩余步骤将不会被执行。
这里的主要问题是分区程序的子步骤没有被索引,因此被检测为等效的,但它们不是。
此外,我不想将子步骤设置为可重新启动,因为我只想执行缺少的步骤,而不是全部。
我是不是漏掉了什么?对于我想做的事情,你有替代方案吗?
我知道我也可以从分区程序启动一个真正的作业(使用 JobStep),但这不如 FlowStep 强大,因为我们确实受到我们可以提供给作业的参数的限制(没有现有的 ExecutionContext)。我猜这里的人有同样的问题(
Spring batch Partitioning with multiple steps in parallel?)
感谢您的帮助
在研究了 Spring 批处理奥术之后,我想我可以回答我自己的问题,也许可以帮助其他人。
这里的关键是提供我们自己的 StepHandler
而不是默认的 SimpleStepHandler
。在此处理程序中,我们可以使用提供的 ExecutionContext
来管理将包含当前分区 ID 的预定义键。我们只需要使用这个 id 以 step.getName() + ":" + id
.
的形式构建一个唯一的步骤名称
为了插入此自定义 StepHandler
,我们覆盖了默认的 FlowStep
实现。
可以在此处找到完整示例 https://github.com/miremond/spring-boot-sample-batch。
这是我试图在 Spring 批处理作业中实现的目标:
- 分区程序启动 FlowStep
- FlowStep 由 n 个步骤组成
- 万一失败,我想要内部步骤的一致重启
我在重启过程中遇到以下问题: 假设我有 2 个分区,为了简单起见,我有一个 syncTaskExecutor。第一个分区(partition0)运行好了,我们现在运行第二个分区(partition1)。
第一个问题是 FlowStep 的子步骤被检测为重复。这是因为子步骤的名称没有以分区索引为后缀。不过步骤运行少不了。
如果一个子步骤失败,就会发生这种情况。那样的话,在重启时,由于partition0执行的所有子步骤都成功退出,partition1的剩余步骤将不会被执行。
这里的主要问题是分区程序的子步骤没有被索引,因此被检测为等效的,但它们不是。
此外,我不想将子步骤设置为可重新启动,因为我只想执行缺少的步骤,而不是全部。
我是不是漏掉了什么?对于我想做的事情,你有替代方案吗?
我知道我也可以从分区程序启动一个真正的作业(使用 JobStep),但这不如 FlowStep 强大,因为我们确实受到我们可以提供给作业的参数的限制(没有现有的 ExecutionContext)。我猜这里的人有同样的问题( Spring batch Partitioning with multiple steps in parallel?)
感谢您的帮助
在研究了 Spring 批处理奥术之后,我想我可以回答我自己的问题,也许可以帮助其他人。
这里的关键是提供我们自己的 StepHandler
而不是默认的 SimpleStepHandler
。在此处理程序中,我们可以使用提供的 ExecutionContext
来管理将包含当前分区 ID 的预定义键。我们只需要使用这个 id 以 step.getName() + ":" + id
.
为了插入此自定义 StepHandler
,我们覆盖了默认的 FlowStep
实现。
可以在此处找到完整示例 https://github.com/miremond/spring-boot-sample-batch。