【发布时间】:2021-06-15 20:00:28
【问题描述】:
我们正在处理 Spring Batch 作业。该作业每天将运行约 6 个小时,并将从 REST 服务中获取与每条记录相对应的一些值。从 REST 服务检索到值后,它会针对相应的记录进行更新。例如
--------------------
Student
--------------------
Id | Name | Marks
--------------------
1 | John | Null
2 | Sam | Null
3 | Lilly| Null
遍历每条记录(ASC 订单)并根据Id 从 REST 服务获取标记。使用检索到的标记更新列标记。 REST 服务不支持批量操作,一次只能处理一条记录。
建议的解决方案:
- 使用
RepositoryItemReader以ASC 顺序使用固定页面大小从db 读取数据。由于默认情况下没有 ID 范围,因此作业将永远继续运行(每天约 6 小时后停止)。 - 调用 REST 服务以根据每条记录获取标记
Id并使用标记更新学生对象。 (CustomItemProcessor) - 使用
RepositoryItemWriter更新学生对象。
需要解决的问题:
有2个问题:
1.需要知道最后处理的记录才能从那里恢复(我们希望 每天创建一个新的工作实例)。 为了每天运行作业,我们可以对作业进行基准测试并估计 每天将处理的记录数。基于此,我们可以定义 Id 静态表中的范围,以便作业从表中读取范围和 处理范围内的记录。这个解决方案不是很优雅。 另一种方法是将最后获取的(未读取)存储在跟踪中 表并将其用作第二天的下限。我不确定我该怎么做 优雅地实现这一目标。
2.提高工作绩效 在单线程顺序模式下,性能不是很好。这只是 能够处理 1 条记录/2 秒(0.5 条记录/秒)。我用了一个 ThreadPoolTaskExecutor 的线程池大小约为 10,并且能够 达到 4 条记录/秒的性能(这对我们来说非常理想)。
【问题讨论】:
-
为什么不把最后处理的写入数据库,然后选择它作为参数传递呢?
-
是的,我也是这么想的,但是我应该什么时候写最后处理的记录呢? @后工作?是否可以从作业执行上下文中获取此信息?正如我提到的,因为它是多线程的,最后处理的记录不一定是读取记录中的最大 id。
标签: java multithreading spring-boot spring-batch