【问题标题】:Spring Batch - Looping back to any previous step based on a conditionSpring Batch - 根据条件循环回任何上一步
【发布时间】:2020-02-28 18:02:55
【问题描述】:

我对 Spring Batch 很陌生,遇到了一个我找不到解决方案的问题。

我创建了一个包含一个步骤和两个流程的作业:

第 1 步:

检索合同编号列表(为简化起见,将用于搜索更多记录的唯一编号)。使用 ItemReader 单块,它会将单个合同号传递给下一步。

流程 1:

此流程有一个 Step(Reader,Processor,Writer),其 Reader 将选择此合同编号并检索成员 ID 列表。这些 Id 将按块(共 10 个)传递给处理器。

处理器将进一步执行几个查询调用,最终为编写者创建一个参与者详细信息列表。编写器会将这些数据分块写入 Workbook 对象。

流程 2:将所有数据写入工作簿后,将对象作为文件发送到远程位置。这个过程是使用一个 tasklet 完成的,该 tasklet 具有将文件发送到建议的目的地的所有必要细节。

现在,一旦整个过程完成(步骤 1-> 流程 1-> 流程 2),它会检查是否有更多的合同详细信息要写入远程位置。

如果是,则从列表中检索另一个合同编号,然后将其传递给流(flow1 和 flow2) 处理完所有合同编号后,代码以 RepeatStatus.FINISHED 完成

添加图表以便更好地理解:

Diagrammatic representation of the above explanation

看起来像这样:

Job
-> Step 1 (retrieve Id number list but send a single contract number)
   -> Flow 1
      -> Reader
      -> Processor
      -> Writer
   -> Flow 2 
      -> Tasklet (Send file to remote location)
   (If all contract-numbers are not processed go to Step 1 and iterate to the next contract-number else finish the job)

我的问题从这里开始:

  1. 如何根据条件从流程 2 跳回步骤 1?我确实找到了一些建议,人们添加了一个决策器循环,但您可以返回上一步(在这种情况下,流程 2 中不满足条件,流程 2 将被重新触发)。那么如何从 flow2 跳回第 1 步呢?
  2. 如何在整个作业的所有步骤和流程之间传递数据? (不使用执行上下文)

如果您认为有更好的方法,请提出建议。

【问题讨论】:

  • 您的初始输入数据集是固定的还是可以在作业运行时更改?
  • 一旦作业开始运行并且我得到我的输入,它将保持不变。但是,它将是一个需要在作业中逐个迭代的输入列表。

标签: spring spring-batch


【解决方案1】:

如何根据条件从流程 2 跳回步骤 1?

为此使用JobExecutionDecider。您需要确保步骤 1 即使完成也允许重新启动(参数allowStartIfComplete=true)

如何在整个作业的所有步骤和流程之间传递数据? (不使用执行上下文)

如果不想通过执行上下文共享数据,可以在步骤之间使用共享对象。

【讨论】:

  • 感谢您的解决方案。但是,我一直在努力理解它,如果我错了,请纠正我。假设我有 3 个步骤步骤 1-步骤 2-步骤 3。我在步骤 1 之后应用 JobExecutionDecider。然后,它将继续迭代步骤 1,直到满足我放入 JobExecutionDecider 的条件,在这种情况下它将继续下一步步。但在我的用例中,我不仅需要反向执行 Steps,还必须跳转到初始 Step。所以在我的例子中,根据条件,我必须从第 3 步回到第 1 步。该决策者的输入在第 1 步
  • 在步骤 1 将决策所需的数据放入作业执行上下文中。当流程到达步骤 3 时,决策者可以从上下文中读取数据并做出决定是否返回步骤 1 或不是。
  • 确实,决策者将能够决定是结束工作还是返回步骤 1(它将返回一个有助于做出决定的状态)。但是如何从第 3 步调用到第 1 步?做出决定后如何循环回到步骤 1?(它遵循相同的流程步骤 1 -> 步骤 2 -> 步骤 3)我找不到从方法进行直接步骤调用的示例。您能否提供对 Steps 进行此类调用的链接或代码?
猜你喜欢
  • 2016-05-14
  • 2015-04-30
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多