Spring Batch:聚合读者/作者问题

我正在尝试使用Spring批处理并实现聚合读取器(批处理文件,其中多个记录在写入时应被视为一个记录)。 以下是我的读者的代码段:

public class AggregatePeekableReader implements ItemReader<List>, ItemStream { private SingleItemPeekableItemReader reader; private boolean process(T currentRecord , InvoiceLineItemsHolder holder) throws UnexpectedInputException, ParseException, Exception { next = peekNextInvoiceRecord(); // finish processing if we hit the end of file if (currentRecord == null ) { LOG.info("Exhausted ItemReader ( END OF FILE)"); holder.exhausted = true; return false; } if ( currentRecord.hasSameInvoiceNumberAndVendorNumber(next)){ LOG.info("Found new line item to current invocie record"); holder.records.add(currentRecord); currentRecord = null; return true; }else{ holder.records.add(currentRecord); return false; } } private T getNextInvoiceRecord () { T record=null; try { record=reader.read(); } catch (UnexpectedInputException e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); throw e; } catch (ParseException e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); throw e; } catch (Exception e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); } return record; } private T peekNextInvoiceRecord() { T next=null; try { next=reader.peek(); } catch (UnexpectedInputException e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); throw e; } catch (ParseException e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); throw e; } catch (Exception e) { ALERT.error(LogMessageFormatter.format(Severity.HIGH, BATCH_FILE_READ_EXCEPTION, e), e); } return next; } public void close () { reader.close(); } public SingleItemPeekableItemReader getReader() { return reader; } public void setReader(SingleItemPeekableItemReader reader) { this.reader = reader; } private class InvoiceLineItemsHolder { List records = new ArrayList(); boolean exhausted = false; } @Override public void open(ExecutionContext executionContext) throws ItemStreamException { // reader.open(executionContext); } @Override public void update(ExecutionContext executionContext) throws ItemStreamException { // TODO } @Override public List read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { CLASS holder = new SOMECLASS() synchronized (this) { while (process(getNextInvoiceRecord(), holder)) { continue; } if (!holder.exhausted) { return holder.records; } else { //When you hit the end of the file,close the reader. close(); return null; } } } 

}

以上是用于实现可窥探阅读器的工作示例。这样查看下一行(不读取它)并确定是否到达逻辑行尾(有时多行可构成单个事务)

您需要为阅读器实现ItemStream接口。 这将提示Spring Batch,您的读者需要一些操作来打开/关闭流:

 public class InvoiceLineItemAggregatePeekableReader extends AbstractItemStreamItemReader> { @Override public void close() { ... } } 

无论步骤执行期间发生什么错误,流都会关闭。 有关更多示例,请检查Spring Batch本身的类(例如FlatFileItemReader )。

我无法将输入文件移动到Error文件夹,因为Reader未关闭

您可以复制该文件,并在旧文件上使用File.deleteOnExit()以便以后删除或在额外步骤中删除旧文件,例如使用简单的tasklet和仅在业务步骤有exception时调用deleteTaskletStep的流程