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

在Spring批处理中启动一个新作业实例,并将上次处理的记录作为jobParameter?

孙夕
2023-03-14

我们正在进行Spring批量工作。该作业将每天运行约6小时,并将从REST服务中获取与每条记录对应的一些值。一旦从REST服务中检索到该值,就会为相应的记录更新该值。例如。

--------------------
   Student
--------------------
Id | Name | Marks
--------------------
1  | John | Null
2  | Sam  | Null
3  | Lilly| Null

迭代每个记录(ASCorder),并根据Id从REST服务中获取标记。使用检索到的标记更新列标记。REST服务不支持批处理操作,一次只能处理一条记录。

建议的解决方案:

  1. 使用RepositoryItemReader以ASC顺序使用固定页面大小从html" target="_blank">数据库读取数据。由于默认情况下没有ID范围,作业将永远继续运行(每天约6小时后停止)

需要解决的问题:

有两个问题:

1.需要知道从那里恢复的最后处理记录(我们想每天创建一个新的工作实例)。为了每天运行作业,我们可以对作业进行基准测试,并估计它每天将处理的记录数。基于此,我们可以在静态表中定义Id范围,以便作业从表中读取范围并处理范围内的记录。这个解决方案不是很优雅。另一种方法是将最后一次获取(未读取)的数据存储在跟踪表中,并将其用作第二天的下限。我不知道怎样才能优雅地做到这一点。

2.在单线程顺序模式下提高作业的性能,性能不是很好。它只能处理1条记录/2秒(0.5条记录/秒)。我使用了线程池大小约为10的ThreadPoolTaskExecutor,能够实现每秒4条记录的性能(这对我们来说非常理想)。

共有1个答案

赵征
2023-03-14

因为我们也使用ThreadPoolTaskExecutor,所以要知道最后处理的记录并不容易。

订购与多线程不兼容。如果平行排列,“First”和“Last”是未定义的。您需要找到一种方法,以一种与串行或并行执行不可知的方式标记记录。我强烈建议在引入多线程之前,首先找到问题的正确解决方案:正确性比性能更重要。

我们希望每天运行一个新的作业实例。

这意味着当前日期是识别作业参数的良好候选者。

 类似资料:
  • 我有一个spring批处理作业,从CSV文件读取并写入数据库。我想让它重新启动。例如,如果在读取文件或写入db时出现异常,导致作业失败,则应从失败的同一点/块重新开始,而不是从头开始读取整个文件。 我正在从一个endpoint触发作业启动器,并在我的控制器中配置了它。 目前,我正在通过控制器将参数(这是一个唯一的标识符/数字)传递给作业参数,以运行新的作业实例。如果作业失败,我将使用与GET请求中

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我使用的是spring批处理,和通常使用的一样,我有读取器、处理器和写入器。 我有两个问题 1>Reader查询所有200条记录(表中记录总大小为200,我给出了pageSize=200),因此它得到所有200条记录,在处理器中,我们需要所有这些记录的列表,因为我们必须将每个记录与其他199条记录进行比较,以便将它们分组在不同的层中。因此我在想,如果我们能在处理步骤中得到那个列表,我就可以操纵它们

  • 我们使用spring-core和spring-beans 3.2.5、spring-batch-integration 1.2.2、spring-integration-core 3.0.5、spring-integration-file、-http、-sftp、-stream 2.0.3

  • 我需要从远程SFTP服务器下载一个文件,并使用spring batch处理它们。我已经实现了使用Spring集成下载文件的代码。但我无法从Spring集成组件启动Spring批处理作业。我有以下代码: 但这不起作用(上一个方法中的错误),因为找不到文件类型的bean。我不能把这两部分连在一起。如何连接集成和批处理?

  • 是否可以配置Spring批处理管理员来启动主作业和从作业。我们有一个进程作为主节点和3-4个从节点。 Spring batch admin在单独的JVM进程中运行,但所有Spring批处理作业都使用相同的批处理数据库模式。