状態の永続性の防止

デフォルトでは、すべての ItemReader および ItemWriter 実装は、コミットされる前に現在の状態を ExecutionContext に格納します。ただし、これが常に望ましい動作であるとは限りません。例: 多くの開発者は、プロセスインジケーターを使用してデータベースリーダーを「再実行可能」にすることを選択します。入力データに追加の列が追加され、データが処理されたかどうかが示されます。特定のレコードが読み取られる(または書き込まれる)と、処理されたフラグが false から true に反転します。次に、SQL ステートメントに where PROCESSED_IND = false などの追加のステートメントを where 節に含めることができるため、再起動時に未処理のレコードのみが返されるようになります。このシナリオでは、再起動時には関係がないため、現在の行番号などの状態を保存しないことをお勧めします。このため、すべてのリーダーとライターには "saveState" プロパティが含まれています。

  • Java

  • XML

次の Bean 定義は、Java で状態の永続性を防ぐ方法を示しています。

Java 構成
@Bean
public JdbcCursorItemReader playerSummarizationSource(DataSource dataSource) {
	return new JdbcCursorItemReaderBuilder<PlayerSummary>()
				.dataSource(dataSource)
				.rowMapper(new PlayerSummaryMapper())
				.saveState(false)
				.sql("SELECT games.player_id, games.year_no, SUM(COMPLETES),"
				  + "SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD),"
				  + "SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS),"
				  + "SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD)"
				  + "from games, players where players.player_id ="
				  + "games.player_id group by games.player_id, games.year_no")
				.build();

}

次の Bean 定義は、XML での状態の永続化を防ぐ方法を示しています。

XML 構成
<bean id="playerSummarizationSource" class="org.spr...JdbcCursorItemReader">
    <property name="dataSource" ref="dataSource" />
    <property name="rowMapper">
        <bean class="org.springframework.batch.samples.PlayerSummaryMapper" />
    </property>
    <property name="saveState" value="false" />
    <property name="sql">
        <value>
            SELECT games.player_id, games.year_no, SUM(COMPLETES),
            SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD),
            SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS),
            SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD)
            from games, players where players.player_id =
            games.player_id group by games.player_id, games.year_no
        </value>
    </property>
</bean>

上記で設定された ItemReader は、参加する実行に対して ExecutionContext にエントリを作成しません。