私はFlatFileItemReaderを使用してファイルを読み取ります。私はDefaultLineMapperと自分のカスタムFieldSetMapper(myMapper)を接続します。バネバッチ:すべての行のエラーを取得する方法は?
現在、myMapperでは、エラーが発生したときに簡単にログに記録します。ファイル内のすべての行についてすべてのエラーを累積し、ファイルに保存したいと考えています。
私自身のタスクレットの実装を検討していました。しかし、私が読んだところでは、あなたのステップがでなく、チャンク指向の処理を行うの場合にのみこれを行うことをお勧めします。
また、ItemListenerSupportまたはItemReadListenerのいずれかを使用して、onReadError()メソッドを実装することもできます。しかし、私がそれを行うと、どのようにすべてのエラーのリストを保持するグローバル/共有オブジェクトにアクセスできるか分かりません。すべて行です。
私はこれらの2つのオプションの間を行き来して、多くの成功を収めずに働かそうとしています。どんなアドバイスも感謝しています。
***** ***** EDIT
私のコードは、私は考えていない何も非標準ではありません。私はエラーが仕事のParamをログ定義:
Map<String, JobParameter> jobParametersMap ...
jobParametersMap.put("errorsFile", new JobParameter(errorsFileURI));
私のXML設定は次のようになります。
<job ...>
<step ...>
<step id="import">
<tasklet>
<chunk reader="importReader" writer="importWriter" .../>
</tasklet>
</step>
</job>
<bean id="importReader" class="MyImportReader" scope="step">
<property name="resource" .../>
<property name="lineMapper">
<bean class = "...DefaultLineMapper">
...
<property name="fieldSetMapper" ref="importMapper"/>
</bean>
</property>
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
<bean id="importWriter" ...scope="step">
...
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
リーダークラスはFlatFileItemReaderを拡張し、ItemReadListenerを実装しています。ライターは、BatchLoadableWriterおよびStepExecutionListenerを実装します。
私が見る通り、errorsFileはReaderとWriterの両方に渡します。 WriterはerrorsFileをしばらく使用していましたが、私はReaderにそれを追加しました。どちらのクラスもerrorsFileのgetter/setterを持っています。
これらの違いは、Writerで@Overridden write()メソッドが検証してからすべてアイテムをファイルに書き込むことです。したがってすべてエラーはerrorsFileに一度に書き込まれます。また、エラーがある場合はフラグが設定され(hasErrors)、そのフラグの値は@Overridden afterStep()メソッドでチェックされます。 trueの場合は、ExitStatus.FAILEDが返されます。
リーダーの場合、各アイテムに対してdoRead()メソッドが1回呼び出されます。エラーがあれば、errorsFileに書き込むことができます。は、にライターのようなフラグを設定できます。しかし、その旗はその行/項目に対してのみに設定されます。
私は10行をインポートするとしましょう。最初の5つにはエラーがあり、最後の5つにはエラーがありません。 afterRead()が呼び出されると、エラーのない最後に処理されたItemのフラグの値がチェックされるので、hasErrorsはfalseになります。良くない。または、おそらくonReadError()をオーバーライドする方がよいでしょう。しかし、そのメソッドが呼び出される原因は何か、Mapperのエラーですか?
私自身のReaderを実装しているか、ItemReadListenerを実装しているとか、この問題を解決する方法がないかもしれません。私にとっては、このロジックの一部または全部をReaderの "親"に置く必要があるようです。これは... Taskletですか?しかし、私はSOや他の場所でチャンク処理を実行する独自のタスクレットを実装することはお勧めしません。単純な作業の場合にのみ実行する必要があります。私は途方に暮れてよ
...
現在、スプリングバッチジョブを設定している場所にコードを投稿できますか。それはより簡単な答えを与えることができます。 – emeraldjava