【发布时间】:2021-03-24 19:29:04
【问题描述】:
我有一个使用 SpringBoot 的 Spring 批处理项目,我在其中创建了 Configuration 类。我已经为 sep 使用并实现了 ItemReader、ItemProcessor 和 ItemWriter 接口。
下面是ItemReader 的实现。 ItemReader 实现从 JSON 文件 (test-data.json) 读取数据并将其转换为 Java 对象,即 ItemsData。问题是当我启动我的 Spring Boot 应用程序时,
spring 批处理作业一直在无限循环中运行并且永不停止。我阅读了一些文档,它说除非并且直到ItemReader 没有返回null,否则它将继续运行弹簧批处理作业。所以我想知道如何解决这个问题并使批处理作业在每个“预定时间”只运行 1 次。
@Component
@Slf4j
public class ItemsReader implements ItemReader<ItemsData> {
@Override
public ItemsData read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
Gson gson = new Gson();
Reader reader = Files.newBufferedReader(Paths.get("./src/main/resources/test-data.json"));
ItemsData itemsData = new Gson().fromJson(reader, new TypeToken<ItemsData>() {}.getType());
reader.close();
log.info("**************** Items read for processing");
return itemsData;
}
}
【问题讨论】:
-
完成后返回
null。看起来你不明白ItemReader的作用。我怀疑你读过这个文件一次,你的ItemProcessor被用来分割它。别。让ItemReader读取单个元素,完成后返回null。 -
+1 @M.Deinum 所说的。来自ItemReader的Javadoc:
Implementations are expected to be [..] returning null when all input data is exhausted. -
我找到了解决方案。这是更新的代码:
标签: spring spring-boot spring-batch