@Async to make it run asynchronously@Async for async methods in Spring Boot - Mini Project: Build & Apply
TaskService with a method public void runLongTask() that simulates a long task by sleeping for 3000 milliseconds inside a try-catch block.Use Thread.sleep(3000) inside runLongTask() to simulate a delay.
@EnableAsync annotation above the class declaration to enable async support.Import and add @EnableAsync above your main application class.
TaskService class, add the @Async annotation above the runLongTask() method to make it run asynchronously.Import @Async and place it just above runLongTask().
TaskController with a GET endpoint /start-task that calls taskService.runLongTask() and immediately returns the string "Task started".Create a controller with a GET method that calls the async method and returns immediately.
Practice
What is the main purpose of using @Async in a Spring Boot application?
Solution
Step 1: Understand what
@Asyncdoes@Asyncallows methods to run in a separate thread, so they don't block the main thread.Step 2: Identify the main benefit
This helps keep the app responsive by running long tasks in the background.Final Answer:
To run methods in the background without blocking the main thread -> Option DQuick Check:
Background execution = To run methods in the background without blocking the main thread [OK]
- Thinking @Async speeds up method execution
- Confusing @Async with security annotations
- Assuming @Async retries failed methods automatically
Which annotation must be added to a Spring Boot configuration class to enable @Async support?
Solution
Step 1: Recall the enabling annotation for async
Spring Boot requires@EnableAsyncon a configuration class to activate async processing.Step 2: Confirm the exact annotation name
The correct annotation is@EnableAsync, not any other variant.Final Answer:
@EnableAsync -> Option AQuick Check:
Enable async = @EnableAsync [OK]
- Using @EnableScheduling instead of @EnableAsync
- Guessing annotation names without checking docs
- Confusing @Async with enabling annotations
Consider this Spring Boot method annotated with @Async:
@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Done");
}What will be the output if you call fetchData().get()?
Solution
Step 1: Understand CompletableFuture with @Async
The method returns a CompletableFuture that completes immediately with "Done".Step 2: Calling get() on CompletableFuture
Callingget()blocks the caller until the async task finishes and then returns the result.Final Answer:
It blocks until the async task completes and returns "Done" -> Option AQuick Check:
CompletableFuture.get() blocks and returns result [OK]
- Assuming async methods return immediately without blocking on get()
- Thinking async methods can't return values
- Confusing exceptions with null returns
Given this Spring Boot service method:
@Async
public void process() {
System.out.println("Start");
throw new RuntimeException("Error");
}What happens when process() is called?
Solution
Step 1: Understand exception handling in @Async methods
Exceptions in async methods run in a separate thread and do not propagate to the caller.Step 2: What happens to the exception?
The exception is logged by Spring but does not crash or throw on the caller thread.Final Answer:
The exception is logged but does not affect the caller thread -> Option BQuick Check:
Async exceptions logged, caller unaffected [OK]
- Expecting exceptions to propagate to caller immediately
- Thinking async methods run synchronously
- Assuming exceptions are ignored silently
You want to run two independent tasks asynchronously and wait concurrently for both to finish before proceeding. Which approach using @Async and CompletableFuture is correct?
@Async
public CompletableFuture<String> taskOne() { ... }
@Async
public CompletableFuture<String> taskTwo() { ... }
public void runTasks() throws Exception {
CompletableFuture<String> future1 = taskOne();
CompletableFuture<String> future2 = taskTwo();
// What to do here?
}Solution
Step 1: Understand waiting for multiple async tasks
Callingget()sequentially works but is inefficient and blocks one after another.Step 2: Use CompletableFuture.allOf for parallel waiting
CompletableFuture.allOf(future1, future2).join()waits for both tasks to complete concurrently.Final Answer:
Use CompletableFuture.allOf(future1, future2).join() to wait both -> Option CQuick Check:
Wait all async tasks with allOf().join() [OK]
- Calling get() sequentially causing unnecessary blocking
- Not waiting at all and proceeding too early
- Trying to manually complete futures which is incorrect
Ready to prove it?
Pass the test and this pattern moves unknown
