2014-01-18 2 views
0

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

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

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

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

Спасибо.

+1

Если файл мал вы можете установить высокую совершить-интервал, чтобы заставить одного куска processione , но является грязным способом –

+0

Любой другой лучший способ, как превалирование? Я не хочу, чтобы размер куска был слишком высоким. – jyn

+0

Знаете ли вы, сколько байтов длина последней записи? –

ответ

0

Что вам нужно, это читатель с обработчиком обратного вызова нижнего колонтитула. Я столкнулся с аналогичной проблемой, и this link мне очень помог! Перейти к последнему сообщению от Atefeh Zareh. Он также включил конфигурацию xml.

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

+0

Спасибо zeus, но это не то, что я искал, я уже смог разобрать нижний колонтитул и сохранить информацию.Я хотел проверить его до того, как мы обработаем файл, поэтому определил контрольную точку, чтобы проверить соответствие счетчика нижнего колонтитула, а затем назвал шаг загрузки успешной задачи. – jyn

0

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

ItemReader Класса

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

И Item Class является

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 CLA сс является

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 

}

Если какие-либо сомнения, не стесняйтесь отправить на [email protected]

Смежные вопросы