当我“迷惑”读者时,Spring步骤无法正常运行,我是否必须使用tasklet?

时间:2018-02-02 20:51:45

标签: spring-batch spring-mybatis

我知道所有弹簧步骤都需要有一个阅读器,一个写入器和一个处理器。因此,尽管我的步骤只需要一位作家,但我也在努力让读者无所事事,只能让春天快乐。

这是基于找到的解决方案here。它已经过时了,还是我错过了什么?

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

我的编写器被映射到一个简单的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步就是插入行很好。删除很简单,它必须是我的步骤配置...)

1 个答案:

答案 0 :(得分:2)

您的NoOpItemReader返回nullItemReader返回null表示输入已用尽。因为,在你的情况下,它返回的全部内容,框架假定首先没有输入。