2

データベース内のエントリを処理するために、Spring Batch のJdbcPagingItemReaderを使用しています。クエリしているテーブルにタイムスタンプ列があり、次の実行で JdbcPagingItemReaderがタイムスタンプ>「最後に成功したジョブ実行」のアイテムを処理するだけにしたい

これはかなり一般的なユースケースだと思いますが、どういうわけか構成方法がわかりません。ご協力いただきありがとうございます!

4

1 に答える 1

1

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)

于 2011-02-23T09:43:58.733 に答える