Spring Batch-验证输入的csv文件中的标题行,如果文件无效则跳过该文件
作者:互联网
我有一个简单的工作,如下所示:
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit- interval="5000" />
</batch:tasklet>
</batch:step>
itemReader如下:
<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
<property name="linesToSkip" value="1"></property>
<property name="skippedLinesCallback" ref="skippedLinesCallback" ></property>
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="lineTokenizer">
<property name="delimiter" value="," />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
</property>
</bean>
</property>
<property name="resource" value="#{stepExecutionContext['inputKeyName']}" />
</bean>
<bean id"lineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<bean id="skippedLinesCallback" class="com.test.IteMReaderHeader" >
<property name="lineTokenizer" ref="lineTokenizer">
</bean>
我通过在其中插入“ lineTokenizer”来设置“ com.test.IteMReaderHeader”类中输入字段的“名称”.
我需要使用固定的标题值来验证输入的csv文件中第一行的标题行,如果标题行无效,那么在这种情况下,我需要使步骤失败并跳过整个文件,以便可以将下一个文件用于阅读.
请提出实现此目标的合适方法.
非常感谢您的宝贵时间和宝贵的意见.
谢谢 !!
解决方法:
FlatFileItemReader文件停止条件的查找代码被管理;
>具有私有字段boolean noInput
>具有在受保护的doRead()中使用的私有函数readLine()
恕我直言,最好的解决方案是从您skippedLineCallback抛出运行时异常,并将错误作为读取器耗尽的条件进行管理.
敌人示例以这种方式编写您的代表
class SkippableItemReader<T> implements ItemStreamReader<T> {
private ItemStreamReader<T> flatFileItemReader;
private boolean headerError = false;
void open(ExecutionContext executionContext) throws ItemStreamException {
try {
flatFileItemReader.open(executionContext);
} catch(MyCustomExceptionHeaderErrorException e) {
headerError = true;
}
}
public T read() {
if(headerError)
return null;
return flatFileItemReader.read();
}
// Other functions delegation
}
(当然,您必须手动将代表注册为流)
或将FlatFileItemReader扩展为
class SkippableItemReader<T> extends FlatFileItemReader<T> {
private boolean headerError = false;
protected void doOpen() throws Exception {
try {
super.doOpen();
} catch(MyCustomExceptionHeaderErrorException e) {
headerError = true;
}
}
protected T doRead() throws Exception {
if(headerError)
return null;
return super.doRead();
}
}
该代码未经测试直接编写,因此可能会出现错误,但是希望您能理解我的观点.
希望可以解决您的问题
标签:skip,file,spring-batch,spring 来源: https://codeday.me/bug/20191030/1968230.html