在 spring 个批次中跨步骤持久保存大于上下文限制的数据

Persisting data larger then context limit across steps in spring batch

我们正在使用 spring 批处理来处理包含 500K 行的大型 CSV 文件。这个处理的结果是两件事,一行显示一个文章对象,我们没有任何问题,在块完成后我们做 API 调用处理文章列表(每个块 1000)。 API 端点可以过滤掉重复项,因此我们可以一次处理一行。

每行也有数量,第二个结果应该是每个位置相同商品标识符的数量总和

article_code, article_name, size, color, quantity, location, sublocation
123, Nike Shoes, 32, black, 3, store1, sales floor 1
124, Nike shoes, 34, white, 2, store1, sales floor 1
123, Nike Shoes, 32, black, 5, store1, sales floor 2
123, Nike shoes, 32, black, 5, store1, stock room
124, Nike shoes, 34, white, 7, store2, sales floor
123, Nike shoes, 32, black, 3, store2, sales floor
111, Nike shoes, 37, pink, 5, store2, sales floor

这应该会导致创建 3 篇文章和 2 次 API 调用以节省每个位置的库存(文章 123 在位置 store1 的数量为 13,在 store2).

目前我们有一个步骤可以将文章保存在其余部分 API 并且作为副作用在数据库中保留数量,另一个步骤是从每个位置分组的数据库中获取数据并执行 API致电保存库存。

  1. 如果数据步是跨步存储数据的好方法是什么 大于 StepContext?
  2. 的限制
  3. spring 批处理是否有任何优雅的方式来汇总 CSV 文件中未按某些标准排序的行?
  1. 对于我们遇到的类似问题,我们决定采用在同一数据库中添加新 table 的方法,其中 Spring 批处理元 table 是,我们在每次成功 运行 后清除它。流程是: 浏览 CSV 文件,从作者保存 "articles" 中过滤所需数据。在这样做的同时,我们在 table 中汇总了数据。完成此步骤后,您将从新 table 读取数据并在新步骤中保存 "stocks"。

  2. 我不这么认为。这也可能是非常繁重和昂贵的操作,所以这就是为什么 Spring 人们没有费心去实施它。 我想您可以创建自己的 ItemReader 并覆盖 afterPropertiesSet 上的行为以按条件进行排序,但是在具有 500k 行的文件上,您需要进行所有缓冲、内存管理,并且这样您至少要读取文件 2 次开销很大