Spring 批处理:根据 itemReader 中的结果执行作业
Spring Batch: Executing job depending on result in itemReader
我正在开发 spring 批处理应用程序。我设置了一个使用 ItemReader、ItemProcessor 和 ItemWriter 的 1 步作业。我的 ItemReader 执行一个从 API 获取 json 的 HTTP 请求。处理器转换其内容,最后写入器将其保存到文本文件。
我正在从 java 调度程序执行此作业,我在其中设置了 itemReader 用于执行 HTTP 请求 (npag) 的 jobParameters。由于参考的API对结果进行了分页,所以我想执行这个作业的次数不确定,直到http请求的结果是没有更多数据。
示例:
如果reader做http请求(http://whatever/resource?npag=1)获取:
[{"item1":"content1"}....{"item500":"content500"}]
由于 API 以 500 个项目为一组进行分页,我需要再次执行该作业,因为我们可能有更多数据。为此,我更改了 de resource (http://whatever/resource?npag=2) 中的 npag 参数。
如果我得到结果:
[]
没有更多的数据,所以我想停止执行作业。
我的做法:
我试图在 ItemReader 中设置一个 jobParameter,让我在调度程序中知道我是否可以停止或不执行请求。但是在ItemReader中我只知道如何读取jobparameters(带有注解@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;
}
让 reader 一直读到没东西可读不是更好吗?
它可能看起来类似于:
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;
}
一旦 reader returns 为 null,作业将继续下一步,最终终止作业。
我正在开发 spring 批处理应用程序。我设置了一个使用 ItemReader、ItemProcessor 和 ItemWriter 的 1 步作业。我的 ItemReader 执行一个从 API 获取 json 的 HTTP 请求。处理器转换其内容,最后写入器将其保存到文本文件。
我正在从 java 调度程序执行此作业,我在其中设置了 itemReader 用于执行 HTTP 请求 (npag) 的 jobParameters。由于参考的API对结果进行了分页,所以我想执行这个作业的次数不确定,直到http请求的结果是没有更多数据。
示例:
如果reader做http请求(http://whatever/resource?npag=1)获取:
[{"item1":"content1"}....{"item500":"content500"}]
由于 API 以 500 个项目为一组进行分页,我需要再次执行该作业,因为我们可能有更多数据。为此,我更改了 de resource (http://whatever/resource?npag=2) 中的 npag 参数。
如果我得到结果:
[]
没有更多的数据,所以我想停止执行作业。
我的做法: 我试图在 ItemReader 中设置一个 jobParameter,让我在调度程序中知道我是否可以停止或不执行请求。但是在ItemReader中我只知道如何读取jobparameters(带有注解@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;
}
让 reader 一直读到没东西可读不是更好吗?
它可能看起来类似于:
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;
}
一旦 reader returns 为 null,作业将继续下一步,最终终止作业。