对于最新稳定版本,请使用Spring Batch Documentation 6.0.0spring-doc.cadn.net.cn

防止状态持续存在

默认情况下,所有ItemReaderItemWriter实现会将其当前状态存储在执行上下文在提交之前。然而,这不一定总是理想的行为。例如,许多开发者选择让他们的数据库阅读器通过使用进程指示器实现“可重运行”。输入数据会增加一列表示是否已被处理。当某条记录被读取(或写入)时,处理中的标志会从中翻转falsetrue. SQL语句随后可以包含一个额外的语句哪里从句,例如:其中 PROCESSED_IND = 假, 从而确保在重启时只返回未处理的记录。 在 在这种情况下,最好不存储任何状态,比如当前的行号,因为重启时它无关紧要。因此,所有读者和写者都包含'saveState' 属性。spring-doc.cadn.net.cn

以下 bean 定义展示了如何在 Java 中防止状态持久化:spring-doc.cadn.net.cn

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();

}

以下豆子定义展示了如何防止XML中的状态持久化:spring-doc.cadn.net.cn

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上述配置不在执行上下文为 任何其参与的处决。spring-doc.cadn.net.cn