Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Spring批次中重复一个步骤_Spring_Spring Boot_Spring Batch - Fatal编程技术网

如何在Spring批次中重复一个步骤

如何在Spring批次中重复一个步骤,spring,spring-boot,spring-batch,Spring,Spring Boot,Spring Batch,我正在将List传递给MongoDb查询。在MongoDb中,每种商品的详细信息都有超过100万条记录。所以我使用Spring数据MongoDb的skip和limit。因此,我在一次查询执行中为一个商户获取100000条记录 接下来,我想在TransactionItemReader中读取这100000条记录,并将其处理到ItemProcssor,然后将这些记录传递给ItemWriter。一旦这100000条记录被写入。接下来的100000条记录应该从MongoDb中为同一商户提取。类似的,它应该

我正在将
List
传递给MongoDb查询。在MongoDb中,每种商品的详细信息都有超过100万条记录。所以我使用Spring数据MongoDb的skip和limit。因此,我在一次查询执行中为一个商户获取100000条记录

接下来,我想在TransactionItemReader中读取这100000条记录,并将其处理到ItemProcssor,然后将这些记录传递给ItemWriter。一旦这100000条记录被写入。接下来的100000条记录应该从MongoDb中为同一商户提取。类似的,它应该由读卡器读取,由处理器处理,然后由写卡器写入。然后在下一次迭代中,下一个商户也会发生类似的事情

为了通过一次性加载所有事务记录来避免OutOfMemoryError,我使用了这个

我正在考虑重复执行该步骤。例如,在步骤的第一次执行中,提取100000条记录,将其提供给读取器,处理器处理它,然后写入它。然后再次执行此步骤时,需要在某些上下文中维护一些跳过计数,这些跳过计数应用于跳过已获取的记录,接下来的100000条记录应获取、处理和写入


我怎样才能达到这个要求?我是Spring batch的新手。

您可以为此使用分页。 您可以在重写
ItemReader
类的
read()
方法时包含此项

示例代码

Pageable pageRequest = new PageRequest(offSet, limit);
mongoRepository.findAll(pageRequest);
++offSet;

这是现成的使用MongoItemReader@LucaBassoRicci我在查询中传递选择条件,因此使用MongoTemplate,它没有任何find方法的实现,可以将Pageable作为参数。如果不使用MongoRepository,或者我可以通过查询将选择条件传递给findAll(),是否还有其他方法可以实现这一点?我已经使用步骤重复实现了这一点。我面临的另一个问题是,我想在同一个文件中多次写入头(交易组中每个商户一个头),当我使用FlatFileHeaderCallback时,头只在ItemWriter第一次被调用时才被写入,因为下一步是重复的,标题不会再次写入下一个商户交易的同一文件。任何帮助,我如何才能实现它?