Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get response from CompletableFuture

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);
    }
    
like image 207
user3310115 Avatar asked Jan 18 '26 12:01

user3310115


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

like image 145
Eugene Avatar answered Jan 20 '26 02:01

Eugene



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!