java - Spring Boot 批处理 - MultiResourceItemReader : move to next file on error

标签 java spring-boot spring-batch

在批处理服务中,我使用 MultiResourceItemReader 读取多个 XML 文件,该文件委托(delegate)给 StaxEventItemReader。

如果读取文件时发生错误(例如解析异常),我想指定 Spring 开始读取下一个匹配文件。例如,使用 @OnReadError 注释和/或 SkipPolicy。

目前,当引发读取异常时,批处理会停止。

有人知道怎么做吗?

编辑:我看到 MultiResourceItemReader 有一个方法 readNextItem(),但它是私有(private)的 -_-

最佳答案

我有一段时间没有使用 SB,但在查看 MultiResourceItemReader 代码时,我想您可以编写自己的 ResourceAwareItemReaderItemStream 包装器,在其中检查设置为移动到的标志下一个文件或使用委托(delegate)执行标准读取。
该标志可以存储到执行上下文或包装器中,并且应该在下一步移动后清除。

class MoveNextReader<T> implements ResourceAwareItemReaderItemStream<T> {
  private ResourceAwareItemReaderItemStream delegate;
  private boolean skipThisFile = false;

  public void setSkipThisFile(boolean value) {
    skipThisFile = value;
  }

  public void setResource(Resource resource) {
    skipThisFile = false;
    delegate.setResource(resource);
  }

  public T read() {
    if(skipThisFile) {
      skipThisFile = false;
      // This force MultiResourceItemReader to move to next resource
      return null;
    }
    return delegate.read();
  }
}

使用此类作为 MultiResourceItemReader 的委托(delegate),并在 @OnReadError 中注入(inject) MoveNextReader 并设置 MoveNextReader.skipThisFile

我无法自己测试代码,但我希望这是一个很好的起点。

关于java - Spring Boot 批处理 - MultiResourceItemReader : move to next file on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33107103/

相关文章:

Spring Boot OAuth2 和 Oracle IDCS : JWK Set URI responds with 401 UNAUTHORIZED, 需要 token

java - Java 8时间包的Spring Batch序列化问题

java - 在 Wicket 应用程序中同时运行计时器

java - 使用公共(public)方法更改 Java 中的私有(private)字段

spring-boot - 在 Spring Boot JMS 中更改 ActiveMQ 代理 JMX 端口 1099

java - 我在 Spring Boot 中放置了基本身份验证,但是我们如何在没有身份验证登录的情况下访问某些 Api

java - 覆盖 spring batch admin 以使用 mysql 数据库

java - Spring批量并行处理

java - 单个 @StreamListener 将不同的有效负载类型路由到通用服务类

java - 在Android Studio中构建多种口味时,找不到与包名称匹配的客户端