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-expection-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 に答える