在春季批次的步骤中保持数据大于上下文限制

时间:2015-03-06 19:53:07

标签: spring csv 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的数量为3)。

目前,我们正在采取一个步骤,将文章保存在其余API上,并作为DB中的副作用持久量,以及从每个位置分组的数据库中获取数据的其他步骤,并执行API调用以节省库存。

  1. 如果数据步骤是,在步骤中存储数据的好方法是什么 大于StepContext的限制?
  2. 春季批次是否有任何优雅的方法来汇总CSV文件中的行,这些行是按照某些标准没有排序的?

1 个答案:

答案 0 :(得分:0)

  1. 对于我们遇到的类似问题,我们已经决定在Spring Batch元数据表所在的同一个数据库中添加新表的方法,我们会在每次成功运行Job后清除它。流程是: 浏览CSV文件,从编辑器中过滤所需的数据并保存“文章”。在这样做时,我们在表格中汇总了数据。完成此步骤后,您将从新表中读取数据并在新步骤中保存“库存”。

  2. 我不这么认为。这也可能是非常沉重和昂贵的操作,所以这就是为什么Spring人们不打算实施它。 我想你可以创建自己的ItemReader并覆盖afterPropertiesSet上的行为来按标准进行排序,但是对于500k行的文件,你需要做所有的缓冲,内存管理以及你至少读取文件2次的方式是一个很大的开销。