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

Spring Batch-如何将多个项目的列表从输入传递到ItemReader,ItemProc处理器和ItemWriter

吕冠宇
2023-03-14

我有一个简单的csv文件,我正在读1000块,插入到数据库中。现在,如果我想检查db中是否存在行,并且在插入之前是否等于输入,如果存在行,并且行相等-忽略,否则插入或更新,我使用的是ItemProcessor。实现后,意识到jdbc调用太慢(平均120ms),并希望在调用db和检查输入之前对ID进行批处理。在这个阶段,ItemReader一次向ItemProcessor传递一个项目。现在,我试图一次将1000个项目传递给ItemProcessor,这样jdbc调用就可以成批处理。在尝试这一点时,我们能够检查一些示例,但无法获得读者的工作。这是示例代码。

public class customReader implements ItemReader<List<T>> {
private static List<T> records = null;
ItemReader<String> itemReader;

@Autowired customDao customDao; 
private int index = 0; 
@Override public List<T> read() throws Exception {
//reader logic
//while(records.size() < 1000){
      String record = itemReader.read();
      if(Objects.isNull(record)){
          break;
      } 
      records.add(record);
 }
 return (List<T>) records;

}

这是配置

@Bean
    return stepBuilderFactory
            .get("step")
            .<List<String>, List<String>>chunk(1000)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();

如果任何人有一个简单的示例,他们可以将1000行csv文件的列表传递给处理器,请分享该示例。选中了共享的示例:使一个条目读取器返回一个列表,而不是单个对象——Spring批处理获取异常,未选中对处理器、编写器的调用,等等。

Spring Batch-带有列表的项目阅读器和项目处理器上面也检查了,但是有一些异常,比如在注释中列出的和未检查的类型等。如果您有一个没有多线程的事务中具有多行的阅读器、处理器和写入器的工作示例,请分享。

共有1个答案

葛雪松
2023-03-14

从这个问题来看,您似乎在使用自定义ItemReader阅读列表时遇到问题(如果有任何其他问题,请纠正我)。首先,您可以发布ItemProcessor和ItemWriter的结构,这将有助于更深入地了解问题。

为了更清楚地了解Spring批处理是如何工作的,您可以使用阅读器一次阅读一个或多个项目。但是,批处理框架一次发送一个项目给处理器(即使它已经通过批处理读取准备了一个项目列表),写入器将从处理器接收输出列表以写入目标(基于块大小)。如果你正在从读取器读取列表并从读取器返回相同的列表,那么处理器将接收列表进行处理,但写入器应该有列表

 类似资料:
  • 问题内容: 我在数组中呈现对象输入元素的集合。 这使我可以编写onChange处理函数: 但是在此处理程序中,我需要更改的范围对象的ID。因此,我可以更改更改在渲染函数中创建输入元素的方式并更改: 现在,我的处理程序将接收range.id作为参数,但是现在我没有newName值。我可以使用裁判获得它 这是我知道的唯一解决方案,但我怀疑有更好的解决方案。 问题答案: 该参数还通过了,但参数前置到参数

  • 问题内容: 我试图将 List * 类型的多个 项目 传递给控制器,但是,当我提交数据时,它在控制器中显示为null。 * 我想发生的是,我在视图中有一个“费用”列表,并且每个“费用”或项目旁边都有一个来自模型中“已 提交 布尔值”属性的复选框。当我检查项目时,我希望在数据库中更新检查项目的属性 Submitted 和 DateSubmitted 列表。 视图中的@ Html.DisplayFor

  • 以下是我的Spring批处理用例。 > 处理记录。 将处理过的记录逐一写入。 我很清楚第2步和第3步的内容,但不知道如何实现一个可以一次性读取所有记录的读卡器。如何将记录逐一传递给项目处理者/编写者?我应该使用tasklet而不是reader/writer吗?

  • 选项2:(a)创建内部带有SalesReader的DiscountReader(ItemReader方法中的ItemReader)-它为每个正在读取的DiscountObj调用SalesReader。(b)创建SalesWriter将SalesReader获取的日期写入数据库。 在任何情况下,由SalesReader执行的查询的参数都是动态的,因为它必须从当前的DiscountObJ中提取。这是仅

  • 在我的spring批处理代码中,我正在读取一个csv文件,将其处理成一个bean,并尝试用Writer中的值获取该bean。但我无法在Writer中找到豆子。是包含csv文件中的值的bean,我正试图在Writer中获取这些值。我还将bean初始化为一个公共变量,希望它能由读取器、处理器和写入器处理。甚至在之前使用了和注释。请帮我解决这个问题。下面是我的代码,

  • hello jsp页面布局如下: 这是用来扩展HttpServlet的servlet类: