【问题标题】:Spring step does not run properly when I "fib" the reader, must I use a tasklet?当我“fib”阅读器时,Spring step 无法正常运行,我必须使用 tasklet 吗?
【发布时间】:2018-07-13 10:16:38
【问题描述】:

我知道所有 spring 步骤都需要有一个读取器、一个写入器和一个可选的处理器。所以即使我的步骤只需要一个作家,我也在欺骗一个只会让春天快乐的读者。

这是基于找到的解决方案here。是过时了,还是我遗漏了什么?

我有一个包含两个分块步骤的春季批处理作业。我的第一步,deleteCount,只是从表中删除所有行,以便第二步有一个干净的状态。这意味着我的第一步不需要阅读器,所以我按照上面链接的 stackoverflow 解决方案创建了一个NoOpItemReader,并将其添加到我的stepbuilder 对象中(代码在底部)。

我的 writer 被映射到一个简单的 SQL 语句,该语句从表中删除所有行(代码在底部)。

deleteCounts 步骤未清除我的表。我怀疑这是因为我在欺骗读者。

我预计 deleteCounts 会从表中删除所有行,但事实并非如此 - 我怀疑这是因为我的“谎言”读者但不确定我做错了什么。

我的删除声明:

<delete id="delete">
    DELETE FROM ${schemaname}.DERP
</delete>

我的 deleteCounts 步骤:

@Bean
@JobScope
public Step deleteCounts() {
    StepBuilder sb = stepBuilderFactory.get("deleteCounts");
    SimpleStepBuilder<ProcessedCountData, ProcessedCountData> ssb = sb.<ProcessedCountData, ProcessedCountData>chunk(10);
    ssb.reader(noOpItemReader());
    ssb.writer(writerFactory.myBatisBatchWriter(COUNT_DATA_DELETE));
    ssb.startLimit(1);
    ssb.allowStartIfComplete(true);
    return ssb.build();
}

我的 NoOpItemReader,基于 stackoverflow 上之前链接的解决方案:

public NoOpItemReader<? extends ProcessedCountData> noOpItemReader() {
    return new NoOpItemReader<>();
}

// for steps that do not need to read anything
public class NoOpItemReader<T> implements ItemReader<T> {

    @Override
    public T read() throws Exception {
        return null;
    }
}

我省略了一些 mybatis 管道,因为我知道它正在工作(第 2 步更多地涉及 mybatis 的东西,第 2 步插入行就好了。删除是如此简单,它一定与我的步骤配置有关...)

【问题讨论】:

  • 如果你只需要一个作家,你为什么不使用Tasklet
  • @MichaelMinella 在编写此代码后我意识到我可以改用Tasklet。但是,我想知道为什么这不能提高我对 Spring Batch 的理解。根据以前的堆栈溢出答案,我认为使用 noopitemreader 会起作用...

标签: spring-batch spring-mybatis


【解决方案1】:

您的NoOpItemReader 返回null。返回nullItemReader 表示输入已用尽。因为在您的情况下,它返回的就是这些,所以框架首先假定没有输入。

【讨论】:

  • 我明白了。我错误地认为我在问题中链接的堆栈溢出解决方案将扩展到适用于读者和作家。这是一个不正确的假设,是吗?
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2021-08-02
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多