【问题标题】: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.
  • 我找到了解决方案。这是更新的代码:

标签: spring spring-boot spring-batch


【解决方案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 对象的状态就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2018-05-27
    • 2015-05-13
    • 2017-06-25
    • 2017-10-06
    • 2021-06-21
    相关资源
    最近更新 更多