我知道所有弹簧步骤都需要有一个阅读器,一个写入器和一个处理器。因此,尽管我的步骤只需要一位作家,但我也在努力让读者无所事事,只能让春天快乐。
这是基于找到的解决方案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步就是插入行很好。删除很简单,它必须是我的步骤配置...)
答案 0 :(得分:2)
您的NoOpItemReader
返回null
。 ItemReader
返回null
表示输入已用尽。因为,在你的情况下,它返回的全部内容,框架假定首先没有输入。