Spring Batch:如何在侦听器方法中从ItemReader手动读取项目?

时间:2017-09-14 14:23:24

标签: java spring spring-boot spring-batch

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

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

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

简而言之,我想在JdbcCursorItemReader<T>听众中做的是:

  1. 从步骤更新失败的项目。 (这已经通过将一个列表保留在跳过的失败项目的监听器中,并使用单独的@AfterStep来编写错误的项目来实现。)
  2. (假设在write()之后提交ItemWriter,或者数据库能够被读取&#34;脏&#34;) - 使用ItemWriter读入所有父对象所有子对象都处于FAILED状态。
  3. 将父状态更改为FAILED,并使用现有的ItemReader为父级写入。
  4. 但是,我不知道如何从ItemWriter(并正确维护光标)中读取项目,无论是单独还是集合。 ItemReader方法在步骤配置中构建阅读器,而Spring Batch魔术完成剩下的工作。在侦听器方法中使用StepBuilderFactory.reader()看起来很简单,ItemWriter似乎正常工作。我只是希望有人知道如何以这种方式正确阅读write(Collection<T> items)中的项目。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

是的,投射是一种选择。这样的事情应该可以工作:

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