1

我们有一个业务需求来处理尽可能多的文件,然后移动

如果记录 98 中有 100 条记录的文件中存在错误,我们希望能够处理到该点并跳过文件的其余部分,继续下一个文件。

我们正在处理 MultiResourcePartitioner 中的文件。

<batch:step id="processXMLstep"> 
<batch:tasklet  transaction-manager="transactionManager">
<batch:chunk reader="myXmlItemReader" processor="myProcessor
   Writer="myDBWriter" commit-interval="100"  skip-limit="10000">
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception"/>
</batch:skippable-exception-classes> 
</batch:chunk>
<batch:listeners>
<batch:listener ref="myFileNameListener" /> 
</batch:listeners>
</batch:tasklet>
<batch:end on="FAILED"/>
</batch:step>

阅读器正在使用 StaxEventItemReader。

我已向侦听器添加了 onProcessError()、onReadError()、onSkipInProcess()、onSkipInRead()、onSkipInWrite() 和 onWriteError() 方法。我可以看到代码命中 OnReadError() 方法(取决于 XML 错误,onSkipInRead() 方法)。

我可以在 OnReadError() 中做些什么来强制作业跳过文件的其余部分并移动到下一个文件吗?

4

1 回答 1

2

这里的问题与 StaxEventItemReader 中默认的 doRead() 方法引发的异常有关。我们必须编写一个自定义版本来检查特定的 XML 异常,然后将其作为自定义异常抛出(在 skippable-excpection-classes 中使用该自定义异常)。

这是自定义 doRead() 的示例:

    @Override
protected xmlObject doRead() throws CustomXmlException {
    try {
        return super.doRead();
    } catch (Exception e) {
        if (e instanceof DataAccessResourceFailureException) {
            Throwable cause = e.getCause();
            if (cause instanceof XMLStreamException) {
                throw new CustomXmlException(e.getMessage());
            }
        }
        if(e instanceof NonTransientResourceException) {
            e.printStackTrace();
        }
        e.printStackTrace();
        return null;
    }
}

这是xml中的步骤:

    <batch:step id="processXMLstep"> 
    <batch:tasklet  transaction-manager="transactionManager">
        <batch:chunk reader="myXmlItemReader" processor="myProcessor" 
                 writer="myWriter" commit-interval="100" skip-limit="10000">
            <batch:skippable-exception-classes>
                <batch:include class="gov.irs.saas.etl.exception.CustomXmlException" /> 
            </batch:skippable-exception-classes> 
        </batch:chunk>
        <batch:listeners>
            <batch:listener ref="myFileNameListener" /> 
        </batch:listeners>
    </batch:tasklet>
    <batch:end on="FAILED"/>
</batch:step>

这似乎解决了之前会使作业崩溃的 XML 错误(元素上缺少开始标记,以及缺少最后一个 xml 结束标记的截断文件)。

于 2012-06-01T12:24:36.583 回答