2016-08-09 3 views
1

私は、SQLの挿入、削除、または更新ステートメントに基づいている文字列を作成するSpringバッチジョブで作業しています。各行の最初の3文字がadd,、またはdelのいずれかであるフラットファイルを読み込みます。プロセッサでレコードをフィルタリングするSpringバッチ

例:insert into ...update ...delete ...

ADD123456001SOUTHLAND PAPER INCORPORATED ... //more info 
CHG123456002GUERNSEY BIG DEAL FAIRFAX  ...//more info 
DEL123456002GUERNSEY BIG DEAL FAIRFAX  ...//more info 

上記の文から、私のItemReaderは、3つの文字列を生成します。読者はフラットファイル全体を読み込み、これらの文字列のarraylistを私の作家に返します。私の作者はこれらの文字列を受け取り、私のデータベースに書き込みます。

ここに私の問題があります。 addが要求される前にがリクエストされた場合はどうなりますか?既に削除されたものを変更しようとするとどうなりますか?

私はSpringDocsにItemProcessor上に読み込み、フィルタリング処理の記述は、私がやろうとしているまさにです:

例えば、の3つの の異なる種類を含むファイルを読み込み、バッチジョブを考えますレコード:挿入するレコード、更新するレコード、削除するレコードは です。レコードの削除がシステムによってサポートされていない場合、 は、「削除」レコードをItemWriterに送信することは望ましくありません。 しかし、これらのレコードは実際には悪いレコードではないので、スキップするのではなく、 をフィルタリングしてほしいでしょう。その結果、ItemWriter は「挿入」と「更新」レコードのみを受け取ります。

しかし、ドキュメントに記載されているItemProcessorの例は実際には私には意味がありません。誰かが私のプロセスを理解できますか?または、良いItemProcessingのいくつかの例を教えてください。

編集:コマンドの後の6文字は、SQLデータベースに関連付けられたIDです。

答えて

1

あなたがレコードをフィルタリングしていないという質問に記載されている場合は、レコードの順序を変更したいだけです。ここでは、以前の手順でファイルをソートする方が良いでしょう。最初に更新してから削除します)。 ItemProcessorは時折悪い、または無関係な入力行を除外するためのものです。

ItemProcessorを使用して、更新または削除された行が存在すること、または追加する行がまだ存在していないことを検証できます。ここでは、ItemProcessor(入力ファイルの1行につき1つのクエリ)で行う必要があるクエリの量が、ときどき発生する可能性がある条件に対して多くのオーバーヘッドにならないかどうか疑問に思います。あなたの選択は(行ごとにフロントアップのクエリを実行する)フィルタリングするItemProcessorを使用して

  • の間となり、または
  • は、任意のアップフロントのクエリをやってますが、RIがある場合ItemWriterではなく、これらの行をスキップ持っていません違反しました(チャンクをロールバックして一度に1行再試行)。 Spring Batch skip exception for ItemWriterを参照してください。
+0

私はあなたが言っていることを見ていますが、誰かが私にフラットファイルを提供して、決して追加されなかったアイテムを変更したとしましょう。私はまだこの変更が可能であることを確認するために私のデータベースに対してチェックする必要があります。これは処理されませんか? –

+0

@Mike:はい、それはItemProcessorをうまく使用しているように思えますが、そこにあるかどうかをチェックし、そうでなければ例外ファイルに追加することができます。 –

関連する問題