2017-02-05 5 views
1

ジョブインスタンスが現在実行中で、最初の1000レコードで読み取り/処理/書き込み操作の途中であるとします。この期間中に、データベースにインポートされた別の1000レコード。この状況では、1000件のレコードを処理した後、最初のジョブ・インスタンスを完了する必要があります(失敗しないと仮定します)。 2番目のインスタンスは、次の1000レコードをトリガーして処理する必要があります。出来ますか?スプリングバッチ - ジョブ実行中にデータをインポートしたとき

または、残りの1000レコードを処理するステップに責任を負わせますか(つまり、別のステップインスタンスが起動して実行されることを意味します)。

答えて

2

はい、可能です。選択内容の定義方法によって異なります。

たとえば、JdbcCursorItemReaderを使用すると、選択がistが最初に実行されるため、この時点で存在するすべての行が選択されて処理されます。 バッチの処理中に追加された行は、この選択の一部ではありません。

JdbcPagingItemReaderを使用すると、処理されるすべてのチャンクに対してクエリが実行されるため、動作が異なります。したがって、バッチの処理中に挿入されたデータを選択する可能性があります。 しかし、再起動可能性とすべての要素が確実に処理されることに問題がある可能性があります。したがって、PagingItemReaderを使用する場合は、問合せがすべてのチャンクに対して同じデータを選択するようにする必要があります(ページング・リーダーはすべてのチャンクが新しい行を受け取るのに役立つ内部状態を処理します)。 あなたは、挿入された行のタイムスタンプに依存するwhere句の一部を持つか、または状態列を追加することでこれを保証します。そして、最初のステップでは、その時点で利用可能なすべてのエントリの状態を"toProcess"のようなものです。それに加えて、読者の質問はそれらのエントリを選択するだけです。もちろん、エントリが処理されると、状態を更新する必要があります。

+1

「JdbcCursorItemReader」アングルの小さなメモ。再起動には新しいレコードが含まれます。この答えの 'JdbcPagingItemReader'セクションに記載されている状態列は、どちらのリーダーにも推奨されています。 –

+0

ありがとうHansjoerg&Michael – Rahman786

関連する問題