Spring Batch:根据itemReader

时间:2015-08-31 10:55:46

标签: spring spring-batch scheduler

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

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

示例:

如果读者执行http请求(http://whatever/resource?npag=1)获取:

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

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

如果我得到结果:

[]

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

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

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

有什么想法吗?谢谢,

SOLUTION:

正如@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 个答案:

答案 0 :(得分: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,作业就会继续执行下一步,最终终止作业。