Spring Batch:根据 itemReader 中的结果执行作业

Posted

技术标签:

【中文标题】Spring Batch:根据 itemReader 中的结果执行作业【英文标题】:Spring Batch: Executing job depending on result in itemReader 【发布时间】:2015-11-25 09:25:36 【问题描述】:

我正在开发一个弹簧批处理应用程序。我已经设置了一个使用 ItemReader、ItemProcessor 和 ItemWriter 的步骤的作业。我的 ItemReader 执行从 API 获取 json 的 HTTP 请求。处理器转换其内容,最后写入器将其保存到文本文件中。

我正在从 java 调度程序执行此作业,我在其中设置 itemReader 用于执行 HTTP 请求 (npag) 的 jobParameters。由于查询的 API 对结果进行了分页,因此我想执行此作业的次数不确定,直到 http 请求的结果是没有更多数据为止。

例子:

如果阅读器发出http请求(http://whatever/resource?npag=1)获取:

["item1":"content1"...."item500":"content500"]

由于 API 以 500 个项目为一组进行分页,因此我需要再次执行该作业,因为可能我们有更多数据。为此,我更改了 de 资源 (http://whatever/resource?npag=2) 中的 npag 参数。

如果我得到结果:

[]

没有更多数据,所以我想停止执行作业。

我的方法: 我试图在 ItemReader 中设置一个 jobParameter,让我在调度程序中知道我是否可以停止或不执行请求。但是在 ItemReader 中我只知道如何读取作业参数(带有注释@StepCope),而不知道如何设置它。

总结:我需要从作业外部(从执行此作业的调度程序)知道 ItemReader 中设置的变量的值

有什么想法吗?谢谢,

解决方案:

正如@HansjoergWingeier 建议的那样,在 itemReader 中执行所有请求可以解决问题:

private String npag = 1;

@Override
public String read() throws Exception 

    Map<String, String> vars = new HashMap<>();

    while (npag > 0) 
        vars.put("numPag", String.valueOf(npag));

        String result = restTemplate.getForObject(urlAPI, String.class, vars);
        if ("[]".equals(result)) 
            return null;
         else 
            npag++;
            return result;
        
    
    return null;

【问题讨论】:

【参考方案1】:

让读者一直读到没有读完为止不是更好吗?

它可能看起来像这样:

int page = 1;
List<String> items;

public String read() 
 if (items == null || items.isEmpty()) 
    items = callResServiceToGetNextPackage(page);
    pos
    page++;
  
  if (items.isEmpty()) 
     return null; // this will end reading
  
  String itemToReturn = items.removeFirst():
  return itemToReturn;

一旦读取器返回 null,作业将继续执行下一步,最终终止作业。

【讨论】:

mm 好的,所以您的意思是创建一个包含所有请求的步骤(和阅读器)的独特作业,不是吗?我最初的想法是,这个作业是为每个 'npag' 参数的值执行的,但我会考虑一下。

以上是关于Spring Batch:根据 itemReader 中的结果执行作业的主要内容,如果未能解决你的问题,请参考以下文章

Spring-batch学习总结—ItemReader普通文件,数据库,XML,多文件数据读取

Spring Batch:用于高容量和低延迟的 ItemReader 实现

如何在 Spring Batch 中使用 Resource ItemReader

处理器中的 Spring Batch 配置错误

Spring batch - 项目阅读器知道阅读器处理的最后一条记录

带有 JobParameters 的 Spring Batch SQL 命令