【发布时间】:2017-09-14 14:23:23
【问题描述】:
我正在寻找一种在@AfterStep 侦听器方法中使用ItemReader 的方法来检查数据库中批处理作业中正在处理的项目的特定状态。 (这些项目是另一个表中一行的子对象,这些父对象不在批处理作业步骤中处理。)我目前正在使用JdbcCursorItemReader 对 H2 数据库执行 SQL。
但是,我不确定如何从结果集中读取一行,或者我是否需要以编程方式打开/关闭JdbcCursorItemReader,因为我只是使用ItemReader<T> 接口来表示它。我可以访问的唯一方法是read()。我应该改为JdbcCursorItemReader<T>,然后打开/阅读每个项目/关闭吗?是否可以从步骤执行对象中获取块大小以便以块的形式处理它们?
我意识到这不是执行此操作的理想方法,但我需要能够在每一步之后执行此操作,而且 IMO 会不必要地使 Java 配置复杂化以在每个现有步骤之后添加单独的 RPW 步骤这样做。
简而言之,我想在@AfterStep监听器中做的是:
- 更新步骤中失败的项目。 (通过在跳过的失败项目的侦听器中保留一个列表,并使用单独的
ItemWriter来写入错误项目,这已经奏效了。) - (假设
ItemWriter在 write() 之后提交,或者数据库能够被“脏”读取) - 使用ItemReader读取所有子对象都处于 FAILED 状态的所有父对象。 - 将父状态更改为 FAILED 并使用现有的
ItemWriter写入父状态。
但是,我不知道如何从 ItemReader 读取项目(并正确维护光标),无论是单独还是在集合中。 StepBuilderFactory.reader() 方法在步骤配置中构建阅读器,其余的由 Spring Batch 魔术完成。在侦听器方法中使用ItemWriter 似乎很简单,而write(Collection<T> items) 似乎工作。我只是希望这里有人知道如何以这种方式正确读取ItemReader 中的项目。
提前致谢!
【问题讨论】:
-
您为什么要尝试使用
ItemReader而不仅仅是JdbcTemplate? -
因为我已经设置了一个,并且我的假设是 ItemReader 只是 NamedParameterJdbcTemplate 的美化包装。
标签: java spring spring-boot spring-batch