Проверка нижнего колонтитула

Я использую пакет Spring для обработки файла с записями верхнего и нижнего колонтитула. Нижний колонтитул содержит общее количество записей в файле. Если количество подробных записей не совпадает с количеством в нижнем колонтитуле, файл не должен обрабатываться.

Я использую Custom Line Tokenizer, который обрабатывает заголовок, детализацию и запись нижнего колонтитула. Когда встречается запись нижнего колонтитула, если количество подсчетов совпадает с количеством записей подробностей, я выбрасываю исключение.

Но проблема, с которой я сталкиваюсь, заключается в том, что если для размера чанка задано небольшое число, например 10, а в файле 20 записей, первые 10 подробных записей сохраняются в БД, даже несмотря на то, что количество подсчетов нижнего колонтитула соответствует общему количеству записей.

Есть ли способ проверить количество нижнего колонтитула по количеству записей в файле перед вызовом Writer?

Благодарю.

2 ответа

Вам нужен читатель с определенным обработчиком обратного вызова нижнего колонтитула. Я столкнулся с подобной проблемой, и эта ссылка мне очень помогла! Смотрите последнее сообщение Атефех Заре. Он также включил конфигурацию XML.

А что касается первых десяти сохраняемых, вы можете сделать еще один шаг проверки перед основным этапом обработки, который будет просто проверять количество заголовков и трейлеров. Не пишите никакой постоянной логики в писателе. Если подсчет не выполнен, остановите задание, чтобы оно не перешло на этап обработки.

Путем написания нашего собственного средства чтения предметов, а также классов предметов для обработки заголовков, нижнего колонтитула, записей данных и нахождения количества заголовков, нижних колонтитулов, записей данных

Item Reader Class

public class AggregateItemReader<T> implements ItemStreamReader<ResultHolder> {


private ItemStreamReader<AggregateItem<T>> itemReader;

@Override
public ResultHolder read() throws Exception {
    ResultHolder holder = new ResultHolder();

    while (process(itemReader.read(), holder)) {
        continue;
    }

    if (!holder.isExhausted()) {
        return holder;
    }
    else {
        return null;
    }
}

private boolean process(AggregateItem<T> value, ResultHolder holder) {
    // finish processing if we hit the end of file
    if (value == null) {
        LOG.debug("Exhausted ItemReader");
        holder.setExhausted(true);
        return false;
    }

    // start a new collection
    if (value.isHeader()) {
        LOG.debug("Header Record detected");
        holder.addHeaderRecordCount();
        return true;
    }

    // mark we are finished with current collection
    if (value.isFooter()) {
        LOG.debug("Tailer Record detected");
        holder.addTailerRecordCount();
        holder.setFiledRecordCount(value.getFieldSet().readInt(3));
        System.out.println("###########################################"+holder.getDataRecordCount()+"############################################");
        return false;
    }

    // add a simple record to the current collection

    holder.addDataRecordCount();
    return true;
}

И класс предметов

public class AggregateItem<T> {

@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getData(FieldSet fs) {
    return new AggregateItem(fs, false, false, true);
}

@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getFooter(FieldSet fs) {
    return new AggregateItem(fs, false, true, false);
}


@SuppressWarnings("unchecked")
public static <T> AggregateItem<T> getHeader(FieldSet fs) {
    return new AggregateItem(fs, true, false, false);
}

private boolean data = false;
private FieldSet fieldSet;

private boolean footer = false;

private boolean header = false;

private T item;

public AggregateItem(FieldSet fs, boolean header, boolean footer, boolean data) {
    this(null);
    this.header = header;
    this.footer = footer;
    this.data = data;
    this.fieldSet = fs;
}


public AggregateItem(T item) {
    super();
    this.item = item;
}

public FieldSet getFieldSet() {
    return fieldSet;
}


public T getItem() {
    return item;
}

public boolean isData() {
    return data;
}


public boolean isFooter() {
    return footer;
}


public boolean isHeader() {
    return header;
}

}

И ResultHolder класс

public class ResultHolder implements {
private Integer headerRecordCount = 0;
private Integer dataRecordCount = 0;
private Integer tailerRecordCount = 0;
private Integer filedRecordCount;//this is to save record count given in source File
private boolean exhausted = false;//setters & getters

}

Если у вас есть какие-либо сомнения, пишите на sk.baji6@gmail.com

Другие вопросы по тегам