如何设置flatfileItemReader中读取的最大记录数?

时间:2016-06-12 06:17:11

标签: spring-batch

我的应用程序只需要修复没有要读取的记录 &安培;处理。如果我使用的是flatfileItemReader,如何限制它? 在基于DB的Item Reader中,当达到max_limit时,我返回null /空列表。 如果我使用的是org.springframework.batch.item.file.FlatFileItemReader,如何实现相同的目标?

3 个答案:

答案 0 :(得分:5)

对于FlatFileItemReader以及扩展ItemReader的任何其他AbstractItemCountingItemStreamItemReader,都有一个maxItemCount属性。通过配置此属性,ItemReader将继续读取,直到满足以下任一条件:

  1. 输入已用尽。
  2. 读取的项目数等于maxItemCount
  3. 在上述两种情况中的任何一种情况下,读者都会返回null,向Spring Batch表明输入已完成。

    如果您有任何需要满足此要求的自定义ItemReader实施,我建议您延长AbstractItemCountingItemStreamItemReader并从那里开始。

答案 1 :(得分:3)

最好的方法是编写一个代表,负责跟踪读取记录的数量,并在固定计数后停止;组件应该处理执行上下文以允许可重新启动

class CountMaxReader<T> implements ItemReader<T>,ItemStream
{
  private int count = 0;
  private int max = 0;
  private ItemReader<T> delegate;

  T read() {
    T next = null;
    if(count < max) {
      next = delegate.read();
      ++count;
    }
    return next;
  }

  void open(ExecutionContext executionContext) {
    ((ItemStream)delegate).open(executionContext);
    count = executionContext.getInt('count', 0);
  }

  void close() {
    ((ItemStream)delegate).close(executionContext);
  }

  void update(ExecutionContext executionContext) {
    ((ItemStream)delegate).update(executionContext);
    executionContext.putInt('count', count);
  }
}

这适用于任何读者。

答案 2 :(得分:1)

public class CountMaxFlatFileItemReader extends FlatFileItemReader {

    private int counter;

    private int maxCount;

    public void setMaxCount(int maxCount) {
        this.maxCount = maxCount;
    }

    @Override
    public Object read() throws Exception {
        counter++;
        if (counter >= maxCount) {
            return null; // this will stop reading
        }
        return super.read();
    }
}

这样的事情应该有效。只要返回null,阅读器就会停止阅读。