我正在生成 excel 文件并将其提供给 UI。 Excel 文件包含来自两个第三方 api 的数据。 第一个第三方调用将返回数据列表,然后我比较了数据库表中的这些数据,比较后我需要为过滤后的数据调用第二个第三方 api。 第一个第三方 api 返回 200 到 300 条记录我过滤或匹配数据库中的记录,只有匹配的记录被传递给第二个第三方 api 所以第二个第三方 api 被调用 100 到 200 次取决于来自第一个第三方 api 的数据
现在获取数据和生成 excel 文件需要超过 1 分钟的时间 有什么方法可以让我在 20 到 30 秒内生成响应。 我正在使用 spring boot,对于异步,我正在使用 completablefuture,这对我来说是非常新的。
谢谢
@GetMapping("/api/report")
public ResponseEntity<InputStreamResource> generateReport(
@ApiParam("fromDate") @RequestParam(value = "fromDate", required = false) String fromDate,
@ApiParam("toDate") @RequestParam(value = "toDate", required = false) String toDate) throws Exception {
InputStreamResource isr = null;
ByteArrayInputStream export = null;
if (StringUtils.isBlank(fromDate) || StringUtils.isBlank(toDate)) {
throw new Exception(HttpStatus.BAD_REQUEST.value(), "from date and to date is required");
}
List<DateRange> dateRangeList = convertToListOfDateRangeObj(fromDate, toDate);
export = service.generateReport(dateRangeList);
isr = new InputStreamResource(export);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.add("Content-Disposition", "attachment; filename=" + "Report.xls");
return ResponseEntity.ok().headers(headers).body(isr);
}
public ByteArrayInputStream generateReport(List<DateRange> dateRangeList)
throws ParseException, IOException, HttpStatusCodeException, JSONException {
List<ExcelData> reportData = new ArrayList<>();
List<ExcelData> finalReportData = new ArrayList<>();
for (DateRange dateRange : dateRangeList) {
reportData = getData(dateRange.getFromDate(), dateRange.getToDate());
finalReportData.addAll(reportData);
}
//logic to generate excel (Apache POI)
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
return new ByteArrayInputStream(outputStream.toByteArray());
}
private List<ExcelData> getData(String from, String to)
throws HttpStatusCodeException, UnsupportedEncodingException, JsonProcessingException, JSONException {
List<Excel> excelDataList = new ArrayList<>();
List<ResponseData> dataDetails = new ArrayList<>();
ResponseData list = First_thirdpartyCall(from, to, null);
for (ResponseData data: list.getData()) {
dataDetails.add(data);
}
dataDetails = dataDetails.stream()
.filter(s -> s.getName().indexOf("EA") == 0 || s.getName().indexOf("EE") == 0)
.collect(Collectors.toList());
List<String> matchingRecords = getMatchingRecordFromDB(
dataDetails.stream().map(s -> s.getName()).collect(Collectors.toList()));
dataDetails = dataDetails.stream().filter(s -> matchingRecords.contains(s.getName()))
.collect(Collectors.toList());
for (int i = 0; i < dataDetails.size(); i++) {
Info usersObj = second_thirdpartyCall(dataDetails.get(i).getId());
//further process like database calls business logic
}
//After process everything populating List<ExcelData>
return excelDataList;
}
完成所有逻辑后,我生成并以 excel 文件的形式给出响应,UI 正在下载该文件,但这需要花费大量时间 谁能帮我这个。 我也尝试了可完成的未来,但像 restcall 这样的其他线程在后台工作,主线程将响应作为空 excel 文件给出,因为数据仍在其他线程中处理 所以我没有得到输出。 我需要将我的 api 的响应时间缩短到几秒。