3

我有一个简单的工作如下:

<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 文件中具有固定标题值的第一行,如果标题行无效,那么在这种情况下,我需要失败该步骤并跳过整个文件,以便下一个文件可以是用于阅读。

请提出一个合适的方法来实现它。我非常感谢您的时间和宝贵的投入。

谢谢 !!

4

1 回答 1

4

FlatFileItemReader文件停止条件的查看代码管理;

  1. 有私人领域boolean noInput
  2. 私人function readLine()用于受保护doRead()

恕我直言,最好的解决方案是从您的 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();
  }    
}

代码是直接写的,没有测试,所以可能会有错误,但我希望你能理解我的意思。
希望能解决你的问题

于 2013-08-29T19:46:12.283 回答