DEV Community

Shubham Bhati
Shubham Bhati

Posted on

Don't Block Your APIs: Go Async with CompletableFuture

You're building an API that needs to hit multiple external services or do heavy computation. If you're doing this sequentially within a single request thread, you're blocking your web server and wasting resources. Your API latency shoots up and throughput plummets.

Instead, embrace asynchronous processing with CompletableFuture. Wrap those long-running operations in CompletableFuture and let your web thread return immediately, processing other requests. When all async tasks complete, assemble the results.

Here's how a Spring RestController might use it:

@GetMapping("/data")
public CompletableFuture<DataAggregate> getData() {
    CompletableFuture<String> userDetails = userService.fetchUserDetails();
    CompletableFuture<List<Item>> inventoryItems = inventoryService.fetchItems();

    return CompletableFuture.allOf(userDetails, inventoryItems)
            .thenApply(ignored -> {
                String user = userDetails.join();
                List<Item> items = inventoryItems.join();
                return new DataAggregate(user, items);
            });
}
Enter fullscreen mode Exit fullscreen mode

Remember to configure a dedicated ThreadPoolExecutor for these async tasks to prevent thread pool exhaustion and fine-tune your concurrency. Your API will thank you with improved responsiveness and higher throughput.

Top comments (0)