ItemReaders和ItemWriters - 不参与持久化的字段

优质
小牛编辑
135浏览
2023-12-01

默认情况下,所有 ItemReaderItemWriter 在提交之前都会把当前状态信息保存到 ExecutionContext 中。 但有时我们又不希望保存这些信息。 例如,许多开发者使用处理指示器(process indicator)让数据库读取程序 ‘可重复运行(rerunnable)’。 在数据表中添加一个附加列来标识该记录是否已被处理。 当某条记录被读取/写入时,就将标志位从 false 变为 true, 然后只要在SQL语句的where子句中包含一个附加条件, 如 “where PROCESSED_IND = false“, 就可确保在任务重启后只查询到未处理过的记录。 这种情况下,就不需要保存任何状态信息, 比如当前 row number 什么的, 因为在重启后这些信息都没用了。 基于这种考虑, 所有的 readers 和 writers 都含有一个 saveState 属性:

  1. <bean id="playerSummarizationSource" class="org.spr...JdbcCursorItemReader">
  2. <property name="dataSource" ref="dataSource" />
  3. <property name="rowMapper">
  4. <bean class="org.springframework.batch.sample.PlayerSummaryMapper" />
  5. </property>
  6. <property name="saveState" value="false" />
  7. <property name="sql">
  8. <value>
  9. SELECT games.player_id, games.year_no, SUM(COMPLETES),
  10. SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD),
  11. SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS),
  12. SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD)
  13. from games, players where players.player_id =
  14. games.player_id group by games.player_id, games.year_no
  15. </value>
  16. </property>
  17. </bean>

上面配置的这个 ItemReader 在任何情况下都不会将 entries(状态信息)存放到 ExecutionContext 中.