如何强制RepositoryItemReader读取新插入的记录或仅未处理的记录

时间:2019-04-23 14:44:56

标签: spring-batch

我有一个批处理作业,正在从Azure SQL数据库读取记录。用例是将在数据库中连续写入记录,并且我的spring batch作业必须每5分钟运行一次,并读取新插入的记录,到目前为止尚未从上一个作业执行。但是我不确定RepositoryItemReader中是否有内置方法,或者我是否必须为此实现入侵解决方案

 @Bean
    public RepositoryItemReader<Booking> bookingReader() {
        RepositoryItemReader<Booking> bookingReader = new RepositoryItemReader<>();
        bookingReader.setRepository(bookingRepository);
        bookingReader.setMethodName("findAll");
        bookingReader.setSaveState(true);
        bookingReader.setPageSize(2);
        Map<String, Sort.Direction> sort = new HashMap<String, Sort.Direction>();
        bookingReader.setSort(sort);
        return bookingReader;
    }

2 个答案:

答案 0 :(得分:1)

您需要在数据库中添加一个名为“ STATUS”的列。将数据插入表中后,状态应为“未处理”。当您的ItemReader读取数据时,当ItemProcessor和ItemWriter完成其任务时,将状态更改为“处理中”。这样,您可以确保ItemReader仅读取“未处理”数据。

注意:如果使用Task Executor使用多个线程来运行批处理作业,请在阅读器中使用同步方法读取“未处理”记录并将状态更改为“正在进行”。确保多个线程不会获取相同的数据。

答案 1 :(得分:0)

如果不能更改表,那么另一种方法是尽可能多地使用Spring Batch元数据表。

在完成作业之前,您只需将时间戳或某种指示符存储到作业执行上下文中,即可告诉您下一次作业迭代的开始位置。

这可以是“开箱即用”的解决方案。