当前位置: 首页 > 知识库问答 >
问题:

Spring批处理-根据条件返回到之前的任何步骤

马飞
2023-03-14

我是Spring Batch的新手,遇到了一个无法解决的问题。

我创造了一份工作,它有一个步骤和两个流程:

第一步:

检索合同编号列表(为了简化,将使用一个唯一编号来搜索更多记录)。使用ItemReader single chunk,它会将单个合同号传递到下一步。

流程1:

此流有一个步骤(Reader、Procencer、Writer),其Reader将选择此合约号并检索成员ID列表。这些ID将以块(10个)的形式传递给处理器。

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

流程2:一旦所有数据都写入工作簿,对象就会作为文件发送到远程位置。此过程是使用具有将文件发送到建议目标的所有必要详细信息的任务小程序完成的。

现在,一旦整个过程完成(步骤1-

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

添加图表以更好地理解:

上述解释的图示

它看起来像这样:

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将被重新触发)。那么我如何从流程2跳回步骤1呢?
  2. 如何在整个作业的所有步骤和流程之间传递数据?(不使用执行上下文)

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

共有1个答案

璩慎之
2023-03-14

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

为此,请使用JobExecutionClader。您需要确保即使完成了步骤1也允许重新启动(参数lowStartIfComplete=true

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

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

 类似资料:
  • 我试图弄清楚如何处理从返回的数据。 我有一个活动,我正在调用异步Firebase get操作(存在于其他类中的操作),并且我想使用检索到的ArrayList的大小更新活动中存在的。以下是我在活动创建中获取的 Firebase 调用: 这是我的Firebase操作: 在Android中,最好的方法是什么?是否有可能实现各种适配器或完成处理程序?

  • 我需要访问两个数据源: Spring批处理存储库:在内存H2中 我的步骤需要访问。 我在那里看到了几个关于如何创建自定义

  • 我对spring batch基本上是新手。第一步,我从SFTP服务器获取一个文件,并使用JSch将其传输到本地目录。第二步,我读取本地目录中的文件,并将内容写入数据库。问题在于,在某些情况下,只执行saveDruchAltransaction(步骤2),而不执行getRemoteFile(步骤1) 配置类: 读者: 作家: 微线程: 我不知道该怎么做...我一直在尝试我从各地找到的东西。请帮忙谢谢

  • 我有一个由两个步骤组成的Spring批处理作业(到目前为止)。 作业的第一步是在任务中实现的。它接受需要处理的逗号分隔值(CSV)文件(使用很好的业务逻辑块来确定哪些文件),并将它们复制到“Drop Zone”目录中。

  • 我想使用Spring Batch实现一个类似于下面的作业: 在步骤2中的某些情况下,由步骤2的自定义退出代码确定,要么再次启动步骤1,然后再次启动步骤2,要么处理将结束。

  • 我是Spring新手,也是Spring批新手——所以,请耐心等待。 我知道spring batch是帮助运行步骤和任务的框架。 我尝试通过创建步骤和任务来使用spring批处理,但这些步骤和任务是在程序构建/编译时硬编码的。然而,我不知道如何动态创建任务和步骤。 我想做的是让用户创建一个脚本,说明如何从步骤列表中组装任务。每个步骤都将调用对现有RESTendpoint的远程调用。一项任务将包含多个