java - 使用 AbstractPaginatedDataItemReader 进行分页 API 调用的 Spring 批处理
问题描述
我正在尝试调用分页 API,例如。来自 AbstractPaginatedDataItemReader 的搜索 API。我想继续调用这个 API,直到它没有更多的页面数据,我试图在每一页之后继续块,似乎批处理没有超过第 1 页,这是我的代码和配置我正在使用
启动上下文如下
<batch:job id="fileupload">
<batch:step id="readApi">
<batch:tasklet>
<batch:chunk reader="readPaginatedApi" processor="processApiResults"
writer="emailItemWriter" commit-interval="10"/>
</batch:tasklet>
<batch:next on="NEXT_PAGE" to="readPaginatedApi"/>
<batch:end on="END" />
</batch:step>
</batch:job>
这是阅读器片段
@Component("readPaginatedApi")
@Scope("step")
public class ReadPaginatedApi extends AbstractPaginatedDataItemReader<SearchResponse> {
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
this.setName("READER");
this.setExecutionContextName("READER");
String pageSizeString = stepExecution.getJobParameters().getString("page_size");
if (StringUtils.isNotBlank(pageSizeString) && NumberUtils.isParsable(pageSizeString)) {
try {
pageSize = Integer.parseInt(pageSizeString);
} catch (Exception e) {
e.printStackTrace();
}
}
String pageString = stepExecution.getJobParameters().getString("page");
if (StringUtils.isNotBlank(pageString) && NumberUtils.isParsable(pageString)) {
try {
page = Integer.parseInt(pageString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected Iterator<Payee> doPageRead() {
//Call API
//Return iterator of results or empty iterator
}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution) {
AtomicInteger pageAtomicInteger = new AtomicInteger(page);
SearchResponse searchResponse = //call service, get response
if (searchResponse != null && CollectionUtils.isNotEmpty(searchResponse.getItems())) {
pageAtomicInteger.set(page + 1);
return new ExitStatus("NEXT_PAGE", String.format("page %d", page));
}
return new ExitStatus("END", String.format("page %d", page));
}
}
我在这里想念什么?我怎样才能使这项工作?对于这种情况,这是正确的方法吗?感谢对此的任何帮助
解决方案
batch:next
, batch:end
, 等用于定义作业步骤的执行流程。这些并不打算遍历分页项目阅读器的所有页面,它们用于更高级别。
您需要做的是扩展AbstractPaginatedDataItemReader
和实施doPageRead
. 您的实现应该维护当前正在读取哪个页面的状态、项目列表等。
推荐阅读
- c# - 如何将选定的复选框项目从列表存储到 .net 核心中的另一个列表?
- ruby-on-rails - 双自参照模型
- apache-spark - 如何更改数据框中的多个特定日期
- postgresql - 如何将 heroku postgres 备份文件传输到 docker postgres 容器(文件放在哪里?)
- matplotlib - 如何从其他脚本绘制图形实例
- javascript - 将 2 个不同的不和谐通道相互连接
- android - ViewModel 检索空列表,但不应为空 (mutableStateOf)
- microsoft-graph-api - Microsoft Graph API:在创建私人频道时无法与所有者一起添加私人频道成员
- reactjs - React Material UI Select native - 未找到值时不显示为空
- flutter - 在颤动中为DataTable的DataRows添加边距