Spring 以分页 SOAP API 作为输入数据源的批处理
Spring Batch with Paginated SOAP API as input data source
我有一个分页 SOAP API,我必须从中读取数据并使用 Spring 批处理将数据写入数据库。
API 是一个 SOAP API,它将页码作为输入:
<pageNumber>1</pageNumber>
所以我创建了一个 ItemReader
扩展 AbstractPagingItemReader
class 由 Spring Batch 提供。
在 reader 中,我正在覆盖 doReadPage()
方法并将 this.getPage() + 1
作为输入发送到 SOAP API 请求。但是每次批处理作业 运行 Reader 只读取第一页,尽管 API.
[=30 还有 20 个其他页面可供读取=]
我试着按照JPAPagingItemReader
的结构,用this.getPage()
判断当前页,跳转到下一页。
这就是步骤的样子。
return stepBuilderFactory.get("processData").<InputModel, OutputModel>chunk(5)
.reader(itemReader)
.processor(processor)
.writer(writer)
.build();
作业是这样配置的:
return jobBuilderFactory
.get("chunksJob")
.flow(step1(stepBuilderFactory, itemReader(), itemProcessor(), itemWriter()))
.end()
.build();
我是运行按计划工作的
JobExecution jobExecution = jobLauncher.run(job,
new JobParametersBuilder()
.addString("JOB_ID",
String.valueOf(System.currentTimeMillis())).toJobParameters());
return jobExecution.getExitStatus().toString();
我在这里做错了什么,我可以对此进行哪些更改以便每个作业执行都从 API.
中读取所有可用页面
很难说没有你的 ItemReader 实现,但有些事情需要检查...
您是否在创建 ItemReader bean 时设置了 pageSize?默认为 10。如果您的 Web 服务 returns 少于 10 个结果并且您没有设置 pageSize,那可能是问题所在。
您的 Web 服务是否从第 1 页而不是第 0 页开始?答案将决定您是否应该在 doReadPage()
方法中使用 this.getPage() + 1
而不是 this.getPage()
,因为 AbstractPagingItemReader
从第 0 页开始。
在您的 doReadPage()
方法中,您应该将 AbstractPagingItemReader results
列表替换为从您的网络服务返回的项目列表
我有一个分页 SOAP API,我必须从中读取数据并使用 Spring 批处理将数据写入数据库。
API 是一个 SOAP API,它将页码作为输入:
<pageNumber>1</pageNumber>
所以我创建了一个 ItemReader
扩展 AbstractPagingItemReader
class 由 Spring Batch 提供。
在 reader 中,我正在覆盖 doReadPage()
方法并将 this.getPage() + 1
作为输入发送到 SOAP API 请求。但是每次批处理作业 运行 Reader 只读取第一页,尽管 API.
[=30 还有 20 个其他页面可供读取=]
我试着按照JPAPagingItemReader
的结构,用this.getPage()
判断当前页,跳转到下一页。
这就是步骤的样子。
return stepBuilderFactory.get("processData").<InputModel, OutputModel>chunk(5)
.reader(itemReader)
.processor(processor)
.writer(writer)
.build();
作业是这样配置的:
return jobBuilderFactory
.get("chunksJob")
.flow(step1(stepBuilderFactory, itemReader(), itemProcessor(), itemWriter()))
.end()
.build();
我是运行按计划工作的
JobExecution jobExecution = jobLauncher.run(job,
new JobParametersBuilder()
.addString("JOB_ID",
String.valueOf(System.currentTimeMillis())).toJobParameters());
return jobExecution.getExitStatus().toString();
我在这里做错了什么,我可以对此进行哪些更改以便每个作业执行都从 API.
中读取所有可用页面很难说没有你的 ItemReader 实现,但有些事情需要检查...
您是否在创建 ItemReader bean 时设置了 pageSize?默认为 10。如果您的 Web 服务 returns 少于 10 个结果并且您没有设置 pageSize,那可能是问题所在。
您的 Web 服务是否从第 1 页而不是第 0 页开始?答案将决定您是否应该在
doReadPage()
方法中使用this.getPage() + 1
而不是this.getPage()
,因为AbstractPagingItemReader
从第 0 页开始。在您的
doReadPage()
方法中,您应该将AbstractPagingItemReader results
列表替换为从您的网络服务返回的项目列表