gpt4 book ai didi

spring-batch - Spring Batch - 重复的 STEP 消息

转载 作者:行者123 更新时间:2023-12-04 05:22:17 25 4
gpt4 key购买 nike

我有一个 spring 批处理作业,预计将根据 FIFO 顺序处理“N”个作业 ID。这个 spring 批处理作业有 5 个步骤。我们使用 DECIDER 来确定是否存在更多作业 ID。如果是,请转到第一步并运行该作业 ID 的所有步骤。我在 spring-batch 发出的日志中看到“重复步骤”消息,这似乎很好,直到并且除非第一个作业中的步骤(例如 job-id=1)获得 UNKNOWN 状态。在这种情况下,第二个作业 (job-id =2) 的相同步骤无法开始说明“步骤处于未知状态,重新启动很危险......”。是否有更好的方法来定义 spring-batch 作业来处理“N”个作业 ID。

有一个表格保存了工作信息。每个作业将订单放入订单表中。可能需要在同一天处理两个作业。作业可以插入/更新具有相同修订版(其他细节不同)或同一订单号的不同修订版的相同订单号。批处理程序必须根据作业表中的 success_time 以 FIFO 模型处理这些作业。

假设表结构如下

Job_Id      job_name    success_time1           job1        2014-09-29 10:00:002           job2        2014-09-29 13:00:00Order_id    order_number    order_revision  order_details   job_id1           ABC             1               Test1            12           XYZ             1               Test2            13           ABC             2               Test1-Rev2       2

Sample configuration is shown below. For brevity, I have removed metadata definitions and reused the reader and writer.

<batch:step id="abstractParentStep" abstract="true">
<batch:tasklet>
<batch:chunk commit-interval="100" />
</batch:tasklet>
</batch:step>

<-- Using same reader and writer to simplify scenario depiction -->
<batch:job id="OrderProcessingJob">
<batch:step id="Collect-Statistics-From-Staging-Tables" next="Validate-Order-Mandatory-Fields" parent="abstractParentStep">
<batch:tasklet>
<batch:chunk reader="orderReader" writer="orderWriter" />
</batch:tasklet>
</batch:step>
<batch:step id="Validate-Order-Mandatory-Fields" next="Validate-Item-Mandatory-Fields" parent="abstractParentStep">
<batch:tasklet>
<batch:chunk reader="orderReader" writer="orderWriter" />
</batch:tasklet>
</batch:step>
<batch:step id="Validate-Item-Mandatory-Fields" next="decision" parent="abstractParentStep">
<batch:tasklet>
<batch:chunk reader="orderReader" writer="orderWriter" />
</batch:tasklet>
</batch:step>
<batch:decision id="decision" decider="processMoreJobsDecider">
<batch:next on="REPEAT" to="Validate-Order-Mandatory-Fields" />
<batch:end on="COMPLETED" />
</batch:decision>

</batch:job>

在第一步中,我们将检查需要处理多少作业(计数)并将其放入 ExecutionContext。在决策程序中,我们检查处理的作业总数是否与计数匹配,如果有更多的 job_id 需要处理,则返回 REPEAT 状态。

当第一个作业的步骤保持在 UNKNOWN 状态时,我们遇到了上面提到的异常,而第二个作业(因为决策者决定还有一个 job_id 需要处理)得到了如上所示的异常消息。

最佳答案

您应该为每个步骤指定一个唯一的名称。如果您使用分区,这会自动为您完成。

this gist , 文件 partitionedSimple.groovy (您只需下载文件并运行 groovy <filename.groovy> 即可运行所有示例)。
step1 ,我们确定随后需要的步骤数(硬编码为 3)并将其保存在作业上下文中(首先在步骤上下文中,然后我们提升)。我们创建一个分区步骤 partitionedStep ,这将启动 3 个步骤。他们的名字是 repeatedStep:<partition name> .在分区中,我们还放了一个名为 partitionIndex 的键在上下文中,因此我们可以在实现重复步骤的 tasklet 中检索它。

然后我们运行一个示例,在它处理第 2 项时强制它失败。我们得到以下步骤执行:

状态为:失败
步骤执行:
1:步骤1
2:partitionedStep失败
4:重复步骤:partition_1
5:repeatStep:partition_2 FAILED
3:重复步骤:partition_3

如果我们然后重新启动此作业并删除错误触发,则只会处理第二项:

状态为:已完成
步骤执行:
6:分区步骤
null:repeatStep:partition_1 STARTING
7:重复步骤:partition_2
null:repeatStep:partition_3 STARTING

我还添加了一个 slightly more complicated example其中重复的步骤实际上是一个流程步骤,并且步骤名称是手动动态生成的——如果您想重复一个流程,这一点很重要,因为您必须为流程的每次执行中的步骤指定唯一的名称.

这也可以在不分区的情况下完成,使用 looping decider .这里的想法是您有一个重复的包装步骤( allowStartIfComplete )并用您想要的步骤包装流程。由于步骤作用域 bean 工厂,这些步骤是按需创建的。看似多余的包装步骤的原因是 job() 内部的流构建器bean factory 需要提前知道步骤名称以构建转换状态,因此我们将此时未知的步骤名称“隐藏”在另一个步骤中。也许有一种方法可以简化它。第一次运行的执行是:

步骤执行:
1:步骤1
2:包裹步骤
3:重复-1
4: wrappingStep FAILED
5:重复-2失败

(通知 repeated-3 永远不会执行)

在第二次运行时:

步骤执行:
6:包裹步骤
7:包裹步骤
8:重复-2
9:包裹步骤
10:重复-3

关于spring-batch - Spring Batch - 重复的 STEP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25425731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com