春季批处理继续运行

Posted

技术标签:

【中文标题】春季批处理继续运行【英文标题】:Spring batch keeps running 【发布时间】:2021-03-24 19:29:04 【问题描述】:

我有一个使用 SpringBoot 的 Spring 批处理项目,我在其中创建了 Configuration 类。我已经为 sep 使用并实现了 ItemReaderItemProcessorItemWriter 接口。

下面是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 对象的状态就可以了。

【讨论】:

以上是关于春季批处理继续运行的主要内容,如果未能解决你的问题,请参考以下文章

在itemwriter中,春季批处理未在运行时异常上滚动

动态创建作业的春季批处理测试

春季批处理启动器应用程序 - 无法启动

无法在春季批处理中序列化此事务的访问

IndexOutOfBoundsException 春季批处理和春季启动

春季启动批处理到具有多个作业的春季云任务