我们可以在 Spring Batch Processor 中一起处理整个块吗

问题描述 投票:0回答:1

我有一个场景,员工暂存表中有数百万条记录,我需要丰富该值并将其存储在员工最终表中。现在我正在使用块处理,块大小为 10,000。

在我必须进行丰富的处理器中,我想收集该块的所有员工 ID,并对每个块执行 1 次 API 调用并丰富值。而不是百万要求百万条记录。

我观察到我现在使用的扩展 RepositoryItemReader 的阅读器没有返回列表,因为我正在使用 JPA 我正在使用 RepositoryItemReader。 因此,即使块大小为 10,000,每个项目也会进行 1 次处理。

我们可以从 reader 获取整个 List 并对其进行处理吗? 或者还有其他方法吗,因为我无法真正为每条记录拨打 1 个电话。

public class EmployeeStagingReader extends RepositoryItemReader<EmployeeStaging>{
     public EmployeeStagingReader(EmployeeStagingRepository repo){
       super();
       this.setRepository(repo);
       this.setMethodName("findAll");
       final Map<String,Sort.Direction> sorts = new HashMap<>();
       sorts.put("ID",Sort.Direction.ASC)
       this.setSort(sorts);
  }
}


public class EmployeeProcessor implements ItemProcessor<List<EmployeeStaging>, List<EmployeeFinal>> {
  
        //Want to Perform transformation  of stagingemployee list of records and return employeefinal list of records

    }
}


@Bean
public Step step1() {
    return this.stepBuilderFactory.get("step1")
                .<List<EmployeeStaging>, List<EmployeeFinal>>chunk(1000)
                .reader(EmployeeStagingReader())
                .processor(EmployeeProcessor())
                .writer(EmployeeFinalWriter())
                .build();
}
java spring spring-boot spring-batch batch-processing
1个回答
0
投票

尝试这个方法。

  1. 在数据持久步骤之前创建一个基于块的 Tasklet 步骤。
  2. 因此,在此 Tasklet 步骤中,对员工 ID 进行分组并进行 API 调用并更新临时表本身中的员工 ID。因此,您可以设法减少 API 调用。
  3. 在最后一步中,只需使用基于卡盘的方法读取数据并写入。
© www.soinside.com 2019 - 2024. All rights reserved.