2017-08-03 6 views
1

Jsr 352 ItemWriterインターフェイスにcheckpointInfoメソッドがあるのはなぜですか?読者と投稿者は、何がコミットされているのかを伝えますか?JSR 352のItemWriterインターフェイスにcheckpointInfoがあるのはなぜですか?どのサンプル実装ですか?

+0

まず、** checkpointInfo()**を使用する必要はありません。 ** open()**のチェックポイント値を無視して、** AbstractItemWriter **のインプリメントのように 'null'を返すようにするだけで済みます。これは一般的です。 フラットファイルに書き込むときに、たとえば文字の位置を追跡するときに、チェックポイントを使用することがあります。ファイル書き込みは通常トランザクションではないので、何らかの理由でこれを考慮する必要があります。 SpringBatchには、誰かが指摘するかもしれないサンプルがいくつかあると私は信じている。サンプルがないことに加えて、あなたの質問に答えますか? –

+0

@ScottKurzありがとうScott!はい私の場合、私は出力としてフラットファイルを持っています。フォローアップの質問として、チャンクのサイズが100で、プロセスが#550で失敗した場合、再起動すると、私の読者はチェックポイントを500とするでしょう。しかし私の作家では、私は550としてそれを持っていることを確認する必要があります。私は以前に処理された500-550を再度書きません。これは、私のライターのチェックポイントを使用できるシナリオです。同意しますか? – user8341239

+0

@ScottKurzありがとう!! – user8341239

答えて

0

checkpointInfo()メソッドを使用する必要はありません。 open()のチェックポイント値を無視して、nullとして)を返すように選択するだけで済みます(AbstractItemWriter)。これは一般的です。リーダ/プロセッサがあなたに与えたもの(読者のチェックポイントなどに基づいて)を挿入/更新するだけで、通常、データベースに書き込むための "カーソル"またはインデックスのタイプは必要ありません。

フラットファイルに書き込むときにチェックポイントを使用することがあります。ファイル書き込みは通常トランザクションではないので、何らかの理由でこれを考慮する必要があります。

単純なアプローチの1つは、最も最近のチャンクの終わりにファイルへのバイト#/オフセットをチェックポイントすることです。したがって、レコード501-600をファイルに書き込んだ後にチャンクトランザクションがロールバックした場合、再起動するとレコード501-600を再読み込みして再処理します。レコード501-600がファイル内にすでに存在していても、レコード500の後のバイト位置から(再)開始するので、それらを上書きします。

再起動はあまり頻繁には必要ないので、あなたが再処理するチャンクの価値が1つしかない場合、これはトランザクションリソースが不足しているために簡単で受け入れやすい方法を提供します。

関連する問題