【问题标题】:Spring Batch with Paginated SOAP API as input data source使用分页 SOAP API 作为输入数据源的 Spring Batch
【发布时间】:2022-02-01 13:02:11
【问题描述】:

我有一个分页 SOAP API,我必须使用 Spring Batch 从中读取数据并处理并将数据写入数据库。
该 API 是一个 SOAP API,它将页码作为输入:
<pageNumber>1</pageNumber>

所以我创建了一个 ItemReader 扩展 Spring Batch 提供的 AbstractPagingItemReader 类。

在阅读器内部,我将覆盖 doReadPage() 方法并将 this.getPage() + 1 作为 SOAP API 请求的输入发送。但是每次运行批处理作业时,Reader 只会读取第一页,尽管还有 20 个其他页面可供从 API 读取。

我尝试按照JPAPagingItemReader的结构,使用this.getPage()判断当前页面,进入下一页。

这就是 Step 的样子。

return stepBuilderFactory.get("processData").<InputModel, OutputModel>chunk(5)
            .reader(itemReader)
            .processor(processor)
            .writer(writer)
            .build();

这是 Job 的配置方式:

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实现吗?

标签: java spring-boot soap spring-batch


【解决方案1】:

没有您的 ItemReader 实现很难说,但有些事情需要检查...

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

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

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

【讨论】:

  • 谢谢@httPants。 API 每页返回 5 个结果,阅读器中的默认页面大小设置为 10。我已将 API 配置更改为返回 10 个结果,现在它正在读取每一页。
猜你喜欢
  • 2015-03-06
  • 2018-01-27
  • 2018-01-01
  • 2013-12-18
  • 2014-10-21
  • 2019-08-17
  • 1970-01-01
  • 2021-02-25
  • 2017-02-16
相关资源
最近更新 更多