我有一个批处理作业,正在从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;
}
答案 0 :(得分:1)
您需要在数据库中添加一个名为“ STATUS”的列。将数据插入表中后,状态应为“未处理”。当您的ItemReader读取数据时,当ItemProcessor和ItemWriter完成其任务时,将状态更改为“处理中”。这样,您可以确保ItemReader仅读取“未处理”数据。
注意:如果使用Task Executor使用多个线程来运行批处理作业,请在阅读器中使用同步方法读取“未处理”记录并将状态更改为“正在进行”。确保多个线程不会获取相同的数据。
答案 1 :(得分:0)
如果不能更改表,那么另一种方法是尽可能多地使用Spring Batch元数据表。
在完成作业之前,您只需将时间戳或某种指示符存储到作业执行上下文中,即可告诉您下一次作业迭代的开始位置。
这可以是“开箱即用”的解决方案。