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

异步Spring批处理。用2个步骤创建工单

南门新知
2023-03-14

我需要多次调用webservice并传递使用来自多个表的数据创建的数据

UI->控制器->服务->(获取数据(表1,表2)并运行一些验证)1。如果验证失败-返回错误消息并停止。2.如果验证通过-调用JobLauncher并返回“任务启动”消息。

异步作业中,我想到遵循2个步骤。

>

  • bulkinsertstep

    >

  • 我需要调用DB查询2个更多的表(Table3、table4)并创建一个大的数据集,从以前提取的Table1、Table2和当前提取的Table3、table4

    将创建的数据集插入表5

    • 阅读器:从表5查询
    • 处理器:为每一行调用Webservice。
    • 编写器:更新表5

    我不知道BulkInsertStep是否有资格成为BatchJob中步骤。基本上,它是一个for loop in for loop in for loop来创建DTO对象列表。读写器、处理器或写器的功能并不复杂…

    避免BulkInsertStep可以避免bulk insert和WebServiceStep中的读取,但是如果以后用户想重新运行失败的webservice记录,那么就很难确定哪些排列已经被处理,哪些排列需要被处理。

    请建议一种设计或另一种方法来实现同样的事情。要求:

    1. 对大数据的WebService调用需要一些时间。因此UI无法等待响应。
    2. 用户可以重新运行处理失败任务的任务。
  • 共有1个答案

    澹台成龙
    2023-03-14

    我不知道BulkInsertStep是否有资格成为BatchJob中步骤。

    我认为您肯定需要将其作为reader-processor-writer。虽然写起来有点复杂,但它会给你带来诸如可重启性和容错性等能力。我之前也在想,reader-processor-writer是一种矫枉过正的做法,但它最终也导致了更好的结构化和可维护的代码

    避免BulkInsertStep可以避免bulk insert和WebServiceStep中的读取,但是如果以后用户想重新运行失败的webservice记录,那么就很难确定哪些排列已经被处理,哪些排列需要被处理。

    我以前也做过类似的事。在这里,我建议在每次调用WebService后,将结果存储在数据库中。这就是table的样子:

    - requestId 
    - requestURL
    - method (GET/POST/PUT/etc.) 
    - requestBody (CLOB)
    - requestHeaders 
    - responseCode 
    - responseBody (CLOB)
    - responseHeaders
    

    有了这个表,我可以确定不会有重复的WebService调用。如果批处理作业失败,我可以在此步骤中简单地重新启动作业,并从未完成的调用开始继续处理。

    为此,您将需要额外的步骤将数据转换为请求(准备它们),然后再次使用Reader-Processor-Writer执行WebService调用。

    对大数据的Webservice调用需要一些时间。因此UI无法等待响应。

    我想你会在单独的线程中开始整个工作。您需要将作业启动程序配置为使用ThreadPoolTaskExecutor。则作业将异步运行。

    用户可以重新运行任务,它处理失败的任务。

    这是简单实现的。您有两种选择:

    • 通过使用joboperator执行失败的作业。这里需要失败作业的ID
    • 通过使用相同的标识参数启动作业。这是你需要预先考虑的。什么是唯一标识你的工作的参数?这里我推荐阅读官方文档:https://docs.spring.io/spring-batch/trunk/reference/html/domain.html#domainjobparameters
     类似资料:
    • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,

    • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以点击 或 来将已选择的工作或所有工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除已选择工作或所有工作,请点击 或 。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可在已选择的工作列表中拖拉工作到所需的位

    • 添加工作到批处理作业 在“常规”选项卡的底部窗格中,选择工作类型,然后如有需要浏览连接、数据库和/或模式以找出你想运行的工作。 你可以双击或拖放工作来将工作从“可用的工作”列表移动到“已选择的工作”列表。若要从已选择的工作列表删除工作,请以相同的方式移除它们。你可以在一个批处理作业中运行来自不同服务器的配置文件。 若要重新排序工作的序列,可使用 “上移”或 “下移”按钮。 如果你想备份整个服务器,

    • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch

    • 给定一个使用分区的Spring批处理作业,是否可能有多个分区步骤? 例如: 在上述示例中,是否可以将另一个添加到(最好不需要为每个分区步骤提供分区器)?如果没有,是否有其他方法来配置多个步骤,这些步骤将针对每个分区逐个执行?

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