如何在springboot中实现依赖任务的异步非阻塞调用[关闭]

问题描述 投票:0回答:0

我正在生成 excel 文件并将其提供给 UI。 Excel 文件包含来自两个第三方 api 的数据。 第一个第三方调用将返回数据列表,然后我比较了数据库表中的这些数据,比较后我需要为过滤后的数据调用第二个第三方 api。 第一个第三方 api 返回 200 到 300 条记录我过滤或匹配数据库中的记录,只有匹配的记录被传递给第二个第三方 api 所以第二个第三方 api 被调用 100 到 200 次取决于来自第一个第三方 api 的数据

现在获取数据和生成 excel 文件需要超过 1 分钟的时间 有什么方法可以让我在 20 到 30 秒内生成响应。 我正在使用 spring boot,对于异步,我正在使用 completablefuture,这对我来说是非常新的。

谢谢

Controller.java文件

@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);
}

Service.java文件

 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 的响应时间缩短到几秒。

java spring-boot api rest asynchronous
© www.soinside.com 2019 - 2024. All rights reserved.