3

Spring のドキュメント (46 ページ、セクション: 5.1.7) には次のように書かれています。

デフォルトでは、再試行またはスキップに関係なく、ItemWriter から例外がスローされると、Step によって制御されるトランザクションがロールバックされます。スキップが上記のように構成されている場合、ItemReader からスローされた例外はロールバックを引き起こしません。

私のコミット間隔は 10 に設定されています。したがって、上記の段落についての私の理解では、10 個のチャンクから 7 番目のレコードを読み取る際にエラーが発生した場合、アイテムはスキップされ、正しい 9 個のレコードが itemReader によって先に送信されます。

ただし、書き込み中に 7 番目のレコードがエラーになった場合、10 レコードのいずれも書き込まれず、ロールバックが発生します。

ただし、skipPolicy でスローされたエラーを含めると、itemWriter は残りの 9 つのレコードをデータベースに書き込み、エラーが発生したレコードをスキップします。これは、上で述べたことと矛盾します。

「アイテム書き込み中のスキップ」の概念を説明してください。

また、単一のエラーがスローされても、次のようになります。

SkipCount を -1 として 2 回、次に 0 として 1 回、そしてまた -1 として shouldSkip(Object, Throwable) メソッドで 1 回。-- この動作が得られません。

また、ロールバック カウントは 2 です。これはどういう意味ですか? なぜ 2 なのですか?


@michaelいくつかのシナリオを使用して動作を説明できますか!!

たとえば、「ファイルから 20 レコードを読み取り、いくつかの処理の後にデータベースに書き込みます。いくつかの例外に対してスキップ ポリシーを設定しています。読み取り、処理、書き込み中に例外が発生した場合はどうなりますか?チャンクはどのようになりますか?コミット、デフォルトの再試行の仕組み、カウントの更新方法など...."

私はまだ行動に混乱しているので、それは本当に私にとって大きな助けになるでしょう..

4

2 に答える 2

9

ユースケースの説明から、さまざまな概念を組み合わせているようです。

スキップシナリオについて説明しますが、スキップはロールバックなしのシナリオのように機能するはずです。

SpringBatchのドキュメントから

スキップ

処理中に発生したエラーによってステップが失敗することはありませんが、代わりにスキップする必要があります

vsロールバックなし

スキップが上記のように構成されている場合、ItemReaderからスローされた例外はロールバックを引き起こしません。

私自身の言葉では、スキップとは次のことを意味します。

ステップで読み取り/処理/書き込み中にエラーが発生した場合、現在のチャンクがロールバックされ、チャンクの各アイテムが個別に読み取り/処理/書き込みされます-不良アイテムはありません。基本的に、Spring Batchは不良チャンクのコミットレート1にフォールバックし、不良チャンクの後に指定されたコミットレートに戻ります。

また、ロールバックカウントは2です-それはどういう意味ですか?なぜ2なの?

B.5から。BATCH_STEP_EXECUTION

ROLLBACK_COUNT:この実行中のロールバックの数。このカウントには 、再試行のロールバックやスキップリカバリ手順のロールバックなど、ロールバックが発生するたびが含まれることに注意してください。

(私のことを強調してください)

また、単一のエラーがスローされたとしても、次のようになります。

SkipCountを-1として2回、次に0として1回、そしてもう一度-1としてshouldSkip(Object、Throwable)メソッドで。-この動作は発生しません。

両方の構成スタイル、skippable-exceptionを使用したskip-policyとskip-limitを使用して単純なスキップジョブを試しましたが、どちらもロールバックとスキップカウントに関して同じように機能しました。

(ステップメタデータは大丈夫ですが、shouldSkip(...)は予想よりもはるかに多く呼び出されているようです)

于 2011-07-18T09:19:19.647 に答える
2

あなたが言及した1つの問題について説明したいと思います:

SkipCount を -1 として 2 回、次に 0 として 1 回、そしてまた -1 として shouldSkip(Object, Throwable) メソッドで 1 回。-- この動作が得られません。

あなたが参照しているメソッドのどのシグネチャを参照しているかはわかりませんshouldSkip()が、私のSkipPolicyインターフェイスには、次のシグネチャを持つメソッドが 1 つしかありません。

boolean shouldSkip(Throwable t, int skipCount) throws SkipLimitExceededException;

このメソッドは、Exception e指定されたskipCountをスキップするかどうかを決定します。

残念ながら、Spring Batch のプログラマーはこのメソッドを悪用して、現在のスキップ カウントに関係なく、一般的に例外がスキップ可能かどうかをテストしますskipCountそのため、パラメータが に設定されたこのメソッドへの呼び出しがいくつかあります-1

ですから、あなたが見た振る舞いについて不思議に思う必要はありません。

于 2013-05-15T13:05:43.320 に答える