Async Operations
Handle asynchronous operations with CompletableFuture support.
Async Controller Endpoints
@RestController
public class AsyncController {
@GetMapping("/users/{id}/async")
public CompletableFuture<ResponseEntity<?>> getUserAsync(@PathVariable Long id) {
return Result.async(() -> userService.findById(id))
.thenApply(ResponseUtils::asResponse);
}
}
Async Service Methods
@Service
public class UserService {
@Async
public CompletableFuture<Result<User>> processUserAsync(Long id) {
return CompletableFuture.supplyAsync(() -> {
// Simulate external API call
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return Result.failure("Processing interrupted");
}
return findById(id);
});
}
}
Combining Async Results
public CompletableFuture<Result<UserProfile>> buildUserProfile(Long userId) {
CompletableFuture<Result<User>> userFuture = Result.async(() -> userService.findById(userId));
CompletableFuture<Result<List<Order>>> ordersFuture = Result.async(() -> orderService.findByUserId(userId));
return userFuture.thenCombine(ordersFuture, (userResult, ordersResult) -> {
if (!userResult.isSuccess()) return Result.failure(userResult.getError());
if (!ordersResult.isSuccess()) return Result.failure(ordersResult.getError());
UserProfile profile = new UserProfile(userResult.getData(), ordersResult.getData());
return Result.success(profile);
});
}