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

Spring Batch -自定义读取器和编写器

李飞翼
2023-03-14

下面是读取多个项目的自定义平面文件项目读取器的代码

public class MultipleItemsFlatFileReader<T> implements ItemReader<List<T>>, ItemStream {

private FlatFileItemReader<T> reader;
private int fetchSize;

public void setReader(String readerName, String filePath, String[] headers, int[] includedFileds,
        Class<? extends T> c, int fetchSize) {
    this.reader = CustomFlatFileReader.getReader(readerName, filePath, headers, includedFileds, c);
    this.fetchSize = fetchSize;
}

@Override
public List<T> read() throws Exception{

    List<T> items = new ArrayList<>();

    for (int count = 0; count < this.fetchSize; count++) {
        T item = reader.read();

        if (item == null) {
            break;
        }

        items.add(item);
    }

    if (!items.isEmpty()) {
        return items;
    }

    return null;
}

@Override
public void open(ExecutionContext executionContext) {
    reader.open(executionContext);
}

@Override
public void update(ExecutionContext executionContext) {
    reader.update(executionContext);
}

@Override
public void close() {
    reader.close();
}

}

下面是自定义项目编写器的代码

public class MultipleItemsCompositeJdbcWriter<T> implements ItemWriter<List<T>> {

private List<JdbcBatchItemWriter<T>> delegates;

public void setDelegates(List<JdbcBatchItemWriter<T>> writers) {
    this.delegates = writers;
}

@Override
public void write(List<? extends List<T>> items) throws Exception {
    for (JdbcBatchItemWriter<T> writer: delegates) {
        for (List<T> item: items) { 
            writer.write(item);
        }
    }
}

}

我是Spring批处理的新手。这段代码正确吗?我可能缺少任何用例?目前我的批处理作业按顺序执行,但将来可能会使用多线程和分区。

需要这样做是因为我需要在处理器中进行数据库查找。为多个项目进行查找比为单个项目进行查找要好。

共有1个答案

吕自明
2023-03-14

此代码是否正确?

答案取决于你工作的具体要求。在您的案例中,一个项目似乎是平面文件中多个物理行的逻辑组。

对于读者,文档中的以下部分可以提供帮助:https://docs.spring.io/spring-batch/4.0.x/reference/html/common-patterns.html#multiLineRecords

此用例还有两个示例

  • https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples#multiline
  • https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples#multiline-order-job

对于编写器,您可以使用<code>CompositeItemWriter

 类似资料:
  • 我试图解析具有如下格式的文件。我想要做的是创建几个var和一个结构数组来包含关于文件的信息。例如,(pseudocode),然后是&。我需要一个解析器/脚本,允许我从文件中获得这些信息。我试图用ANTLR/自定义解析器而不是Regex来实现这一点,因为其中一些文件变得很大;我是在Unity中这样做的,Regex的速度很慢,因为它影响了Unity的垃圾收集。然而,我是使用ANTLR的新手,所以我很难

  • 在 imi 框架中,使用注解可以实现很多功能。比如:路由、模型定义、事务、缓存等等 除了内置的注解以外,如果编写属于自己的注解呢? 这篇教程就来教大家来编写属于自己的注解。 注解定义 注解扫描 imi 是常驻内存运行的,所以冷启动时采用了全量扫描的方式,来实现注解缓存。使用的时候,就和读取配置一样简单高效。 一般需要在配置文件里的beanScan中,配置注解类所在命名空间。在 imi 框架中,涉及

  • 问题内容: 假设我以ng-repeat以表格格式显示以下数据。 以上代码取自http://code.ciphertrick.com/2015/06/01/search-sort-and-pagination- ngrepeat-angularjs/ 这样我们就可以搜索。无论用户在搜索文本框中输入哪种内容,都将基于该过滤器生成数据,但是我的要求有些不同。 我将有一个下拉列表,其中将填充所有字段名称,

  • 我在Cassandra表中有一个时间戳字段,我想将它映射到Java即时类型。在写作时很容易做到这一点。 我添加了自定义编解码器。 编辑 尝试注册读写转换器,但读转换器未被使用。

  • 本文向大家介绍PHP 读取和编写 XML,包括了PHP 读取和编写 XML的使用技巧和注意事项,需要的朋友参考一下 什么是 XML? XML 是一种数据存储格式。它没有定义保存什么数据,也没有定义数据的格式。XML 只是定义了标记和这些标记的属性。格式良好的 XML 标记看起来像这样: DOM读取 XML 用 DOM 编写 XML 以上就是这2段读取和编写XML的DOM代码了,小伙伴们了解了没,有

  • 问题内容: 我有一个简单的场景:向每个HTTP响应自动添加响应标头;我想用Java做到这一点。 看一下,有一些动作示例可以用作注释。我想避免添加到每个处理程序。 综观斯卡拉过滤器中,并具体地讲,我看到一个明确的机制,但我不熟悉不够使用Scala推断为Java。 所以:我从这里去哪里? 问题答案: 不幸的是,目前还没有一种从Java创建和使用过滤器的好方法。但是,您可以使用Scala轻松完成所需的工