【发布时间】: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