【问题标题】:Spring Batch: How to read items manually from an ItemReader in a listener method?Spring Batch:如何在侦听器方法中从 ItemReader 手动读取项目?
【发布时间】:2017-09-14 14:23:23
【问题描述】:

我正在寻找一种在@AfterStep 侦听器方法中使用ItemReader 的方法来检查数据库中批处理作业中正在处理的项目的特定状态。 (这些项目是另一个表中一行的子对象,这些父对象不在批处理作业步骤中处理。)我目前正在使用JdbcCursorItemReader 对 H2 数据库执行 SQL。

但是,我不确定如何从结果集中读取一行,或者我是否需要以编程方式打开/关闭JdbcCursorItemReader,因为我只是使用ItemReader<T> 接口来表示它。我可以访问的唯一方法是read()。我应该改为JdbcCursorItemReader<T>,然后打开/阅读每个项目/关闭吗?是否可以从步骤执行对象中获取块大小以便以块的形式处理它们?

我意识到这不是执行此操作的理想方法,但我需要能够在每一步之后执行此操作,而且 IMO 会不必要地使 Java 配置复杂化以在每个现有步骤之后添加单独的 RPW 步骤这样做。

简而言之,我想在@AfterStep监听器中做的是:

  1. 更新步骤中失败的项目。 (通过在跳过的失败项目的侦听器中保留一个列表,并使用单独的ItemWriter 来写入错误项目,这已经奏效了。)
  2. (假设 ItemWriter 在 write() 之后提交,或者数据库能够被“脏”读取) - 使用 ItemReader 读取所有子对象都处于 FAILED 状态的所有父对象。
  3. 将父状态更改为 FAILED 并使用现有的 ItemWriter 写入父状态。

但是,我不知道如何从 ItemReader 读取项目(并正确维护光标),无论是单独还是在集合中。 StepBuilderFactory.reader() 方法在步骤配置中构建阅读器,其余的由 Spring Batch 魔术完成。在侦听器方法中使用ItemWriter 似乎很简单,而write(Collection<T> items) 似乎工作。我只是希望这里有人知道如何以这种方式正确读取ItemReader 中的项目。

提前致谢!

【问题讨论】:

  • 您为什么要尝试使用ItemReader 而不仅仅是JdbcTemplate
  • 因为我已经设置了一个,并且我的假设是 ItemReader 只是 NamedParameterJdbcTemplate 的美化包装。

标签: java spring spring-boot spring-batch


【解决方案1】:

是的,投射是一种选择。像这样的东西应该可以工作:

if (reader instanceof ItemStreamReader) {
    (ItemStreamReader) reader.open(new ExecutionContext());
}
while((in = reader.read()) != null) {
    <do what you need here>
}
if (reader instanceof ItemStreamReader) {
    (ItemStreamReader) reader.close();
}

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多