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 实现,但有些事情需要检查...

  1. 您是否在创建 ItemReader bean 时设置了 pageSize?默认为 10。如果您的 Web 服务 returns 少于 10 个结果并且您没有设置 pageSize,那可能是问题所在。

  2. 您的 Web 服务是否从第 1 页而不是第 0 页开始?答案将决定您是否应该在 doReadPage() 方法中使用 this.getPage() + 1 而不是 this.getPage(),因为 AbstractPagingItemReader 从第 0 页开始。

  3. 在您的 doReadPage() 方法中,您应该将 AbstractPagingItemReader results 列表替换为从您的网络服务返回的项目列表