データベース内のエントリを処理するために、Spring Batch のJdbcPagingItemReaderを使用しています。クエリしているテーブルにタイムスタンプ列があり、次の実行で JdbcPagingItemReaderがタイムスタンプ>「最後に成功したジョブ実行」のアイテムを処理するだけにしたい
これはかなり一般的なユースケースだと思いますが、どういうわけか構成方法がわかりません。ご協力いただきありがとうございます!
データベース内のエントリを処理するために、Spring Batch のJdbcPagingItemReaderを使用しています。クエリしているテーブルにタイムスタンプ列があり、次の実行で JdbcPagingItemReaderがタイムスタンプ>「最後に成功したジョブ実行」のアイテムを処理するだけにしたい
これはかなり一般的なユースケースだと思いますが、どういうわけか構成方法がわかりません。ご協力いただきありがとうございます!
JdbcPagingItemReader
独自のカスタム再起動ロジックがあります。一意のインデックスフィールドにマップされる最後に取得された値を検索し、そこからジョブを再開します。
JavaDocsから:
再起動時に、最後のソートキー値を使用して、読み取る最初のページを見つけます(したがって、正常に処理されたitmesが削除または変更されたかどうかは関係ありません)。
ご覧のとおり、タイムスタンプフィールドは大きな違いはありません。
コメントを読んだ後に更新する:
では、動的にwhere句を作成してみPagingQueryProvider
ませんか?
<bean id="itemReader" class="org.spr...JdbcPagingItemReader">
<property name="dataSource" ref="dataSource"/>
<property name="queryProvider">
<bean class="org.spr...SqlPagingQueryProviderFactoryBean">
<property name="selectClause" value="select id, name, credit"/>
<property name="fromClause" value="from customer"/>
<property name="whereClause">
<bean class="your.company.WhereClauseFactorybean" />
<property />
<property name="sortKey" value="id"/>
</bean>
</property>
<property name="parameterValues">
<map>
<entry key="status" value="NEW"/>
</map>
</property>
<property name="pageSize" value="1000"/>
<property name="rowMapper" ref="customerMapper"/>
</bean>
WhereClauseFactorybean
ここで、FactoryBean
を使用して最後のタイムスタンプを検索し、タイムスタンプが見つからない場合のようJdbcTemplate
なものを返すように実装します。where timestamp > <your time stamp>
null
参照:
さらにコメントを読んだ後に更新してください:
次に、カスタムを実装し、StepExecutionListener
それにAbstractSqlPagingQueryProvider
インジェクトして、メソッドにwhere句を設定する必要があると思います。beforeStep(StepExecution)