How to set max no of records read in flatfileItemReader?

荒凉一梦 提交于 2019-12-01 23:54:48

For the FlatFileItemReader as well as any other ItemReader that extends AbstractItemCountingItemStreamItemReader, there is a maxItemCount property. By configuring this property, the ItemReader will continue to read until either one of the following conditions has been met:

  1. The input has been exhausted.
  2. The number of items read equals the maxItemCount.

In either of the two above conditions, null will be returned by the reader, indicating to Spring Batch that the input is complete.

If you have any custom ItemReader implementations that need to satisfy this requirement, I'd recommend extending the AbstractItemCountingItemStreamItemReader and going from there.

The best approch is to write a delegate which is responsible to track down number of read records and stop after a fixed count; the components should take care of execution context to allow restartability

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);
  }
}

This works with any reader.

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();
    }
}

Something like this should work. The reader stops reading, as soon as null is returned.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!