春季批处理继续运行
Posted
技术标签:
【中文标题】春季批处理继续运行【英文标题】:Spring batch keeps running 【发布时间】: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.
我找到了解决方案。这是更新的代码:
【参考方案1】:
我找到了解决方案。这是更新的代码:
@StepScope
@Component
@Slf4j
public class ItemsReader implements ItemReader<ItemsData>
private ItemReader<ItemsData> delegate;
@Override
public ItemsData read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException
System.out.println("+++++++++++++++++++ in items read class, delegate value "+delegate);
if (delegate == null)
System.out.println("+++++++++++++++++++ in items read class IF ");
List<ItemsData> data = new ArrayList<>();
data.add(readItemsData());
delegate = new IteratorItemReader<ItemsData>(data);
return delegate.read();
private ItemsData readItemsData() throws IOException
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();
return itemsData;
使用 @StepScope 注释类并维护 ItemsData 对象的状态就可以了。
【讨论】:
以上是关于春季批处理继续运行的主要内容,如果未能解决你的问题,请参考以下文章