当前位置: 首页 > 知识库问答 >
问题:

spring批处理itemWriter仅在获取所有项后写入

糜野
2023-03-14

我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?

public class ReportItemWriter implements ItemWriter<ReportItem> {
    private List<ReportItem> allItems = Lists.newArrayList();
    ... 

public void write(List<? extends ReportItem> reportItems) throws Exception {
    allItems.addAll(reportItems);
    writeReport(allItems);  <-- here it only write chunk of items to the report
}

共有1个答案

岳均
2023-03-14

如果您的Writer上有@jobscope。您可以使用@predestroy(Spring注释)来实现这一点。您可以使用字段来存储需要写入的所有项。在预销毁功能上,你可以写。

private List<YourItem> items = new ArrayList<>();

@Override
public void write(argument here) {
    items.addAll(YourItem);
}    

@PreDestroy
public void teardown() {
    // do the write for all items
}
 类似资料:
  • 我有一个假问题。为了解释我的用例,我有不同类型的DAO;比如说啤酒。。。等等,我想用一个通用的ItemWriter来处理所有的问题。我创建了一个,在这里我定义了; 作家班是这样的; 到目前为止一切都还好。事情变得复杂的地方是,我为每个存储库定义了单独的配置类,其中定义了存储库特定的项。例如,为用户插入数据库的步骤。 当我用IJ编写这段代码时,我抱怨

  • 我在没有ItemWriter的情况下定义了我的tasklet,如下所示: 我得到了这个错误: 配置问题:

  • 我正在尝试在没有项目编写器的情况下使用下面的配置来配置spring批处理步骤。然而,我错误地说writer元素既没有'writer'属性,也没有元素。 我浏览了链接spring批处理:没有ItemWriter的Tasklet。但无法解决问题。有人能告诉我在我提到的代码片段中要做的具体更改吗

  • 我的情况: 我在readerItem中从db读取了类A。然后我需要处理这个类A并创建我在item处理机中做的类B。最后,我将这个类B保存到itemWriter中的db中。 问题:在处理过程中,我还需要创建具有类B外键的类C(约1 mil记录)并保存该类C。 我不能做这样的事情:因为正如我写的,我有大约100万条记录,我需要在内存中存储大约2gb的空间。所以我应该如何解决这个问题。 更新: 可能的解

  • 我正在使用spring批处理使用RepositoryItemReader从postgresql DB读取记录,然后将其写入主题。我看到大约有100万条记录需要处理,但它并没有处理所有的记录。我已经将reader的pageSize设置为10,000并且与提交间隔(块大小)相同

  • 我正在使用JpaPagingItemReaderBuilder查询一个DB,结果被插入到另一个DB中。 查询返回的结果没有任何问题,但我得到了一个错误与读取器的返回,在处理器中,您可以检查我的编码和错误下面。 有谁能给我一点启示吗?为什么我不能处理结果?