Get response from CompletableFuture

Viewed 565

I'm trying to add Async to my fetch operation from the db. However, I'm stuck at trying to get the response from CompletableFuture.allOf(). Join return a 'void. Instead how can I return a List<QuestionResponseData> as mentioned in the code. Below is my code

@RequestMapping(method = RequestMethod.POST, path = "/questionsByAssessmentIdAndQuestionNumber")
    public List<QuestionResponseData> getQuestionsByIdAndLimit(@RequestBody QuestionOptionRequest questionOptionRequest) {
        String assessmentId = questionOptionRequest.getAssessmentId();
        QuestionOptionRequest request = QuestionOptionRequest.builder().assessmentId(questionOptionRequest.getAssessmentId()).startingQuestion(1).build();
        CompletableFuture<List<QuestionResponseData>> questions = questionService.getQuestions(request);
        QuestionOptionRequest request1 = QuestionOptionRequest.builder().assessmentId(assessmentId).startingQuestion(26).build();
        CompletableFuture<List<QuestionResponseData>> questions1 = questionService.getQuestions(request1);
        QuestionOptionRequest request2 = QuestionOptionRequest.builder().assessmentId(assessmentId).startingQuestion(51).build();
        CompletableFuture<List<QuestionResponseData>> questions2 = questionService.getQuestions(request2);
        QuestionOptionRequest request3 = QuestionOptionRequest.builder().assessmentId(assessmentId).startingQuestion(76).build();
        CompletableFuture<List<QuestionResponseData>> questions3 = questionService.getQuestions(request3);

        CompletableFuture.allOf(questions, questions1, questions2, questions3).join();

        //return questionService.getQuestions(questionOptionRequest);
    }
    
1 Answers
 CompletableFuture<List<QuestionResponseData>> futures = new CompletableFuture[]{request, request1, request2, request3};

 List<QuestionResponseData> result =
    CompletableFuture.allOf(futures)
            .thenApply(_void -> Arrays.stream(futures).map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList()))
            .join();

Notice that calling CompletableFuture::join does not actually block, the blocking has already happened in CompletableFuture::allOf

Related