Example of @Async in Spring Boot for Beginners

The @async annotation in Spring Boot allows you to run tasks asynchronously (in the background) without blocking the main thread. This is useful for time-consuming tasks like sending emails, processing large files, or making API calls. ✅ Step-by-Step Guide We will create a Spring Boot app where an API endpoint triggers an async task that runs in the background. 1️⃣ Add Required Dependencies In your pom.xml, ensure you have the Spring Boot starter dependency: org.springframework.boot spring-boot-starter-web Since @async is part of Spring’s task execution framework, no extra dependencies are needed. 2️⃣ Enable Async Processing In your main application or a configuration class, add @EnableAsync to enable async support. import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @Configuration @EnableAsync // Enables @Async support public class AsyncConfig { } 3️⃣ Create an Async Service This service simulates a long-running task that runs asynchronously. import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class AsyncService { private static final Logger logger = LoggerFactory.getLogger(AsyncService.class); @Async // Runs this method asynchronously public void executeAsyncTask() { logger.info("Task started in thread: {}", Thread.currentThread().getName()); try { Thread.sleep(5000); // Simulating a long-running task (5 seconds) } catch (InterruptedException e) { e.printStackTrace(); } logger.info("Task completed in thread: {}", Thread.currentThread().getName()); } } ✅ Explanation: The @async annotation tells Spring to run executeAsyncTask() in a separate thread. Thread.sleep(5000) simulates a 5-second delay, so the task runs in the background. 4️⃣ Create a Controller to Trigger Async Task We create an API endpoint to trigger the async task. import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class AsyncController { private final AsyncService asyncService; public AsyncController(AsyncService asyncService) { this.asyncService = asyncService; } @GetMapping("/start-task") public String startAsyncTask() { asyncService.executeAsyncTask(); return "Async task started! You can continue doing other work."; } } ✅ Explanation: Calling /api/start-task will start an async task without blocking the request. You will immediately receive a response, even though the task is still running in the background. 5️⃣ Run and Test the Application 1️⃣ Start the Spring Boot application 2️⃣ Call the API in a browser or Postman: http://localhost:8080/api/start-task 3️⃣ Expected Output in Response: Async task started! You can continue doing other work. 4️⃣ Console Output (Logs): Task started in thread: SimpleAsyncTaskExecutor-1 (wait 5 seconds) Task completed in thread: SimpleAsyncTaskExecutor-1 ✅ Notice: The logs will print the thread name, confirming the method runs asynchronously in a different thread.

Mar 9, 2025 - 07:14
 0
Example of @Async in Spring Boot for Beginners

The @async annotation in Spring Boot allows you to run tasks asynchronously (in the background) without blocking the main thread. This is useful for time-consuming tasks like sending emails, processing large files, or making API calls.

✅ Step-by-Step Guide

We will create a Spring Boot app where an API endpoint triggers an async task that runs in the background.

1️⃣ Add Required Dependencies

In your pom.xml, ensure you have the Spring Boot starter dependency:


    org.springframework.boot
    spring-boot-starter-web


Since @async is part of Spring’s task execution framework, no extra dependencies are needed.

2️⃣ Enable Async Processing
In your main application or a configuration class, add @EnableAsync to enable async support.

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync  // Enables @Async support
public class AsyncConfig {
}

3️⃣ Create an Async Service
This service simulates a long-running task that runs asynchronously.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {
    private static final Logger logger = LoggerFactory.getLogger(AsyncService.class);

    @Async  // Runs this method asynchronously
    public void executeAsyncTask() {
        logger.info("Task started in thread: {}", Thread.currentThread().getName());

        try {
            Thread.sleep(5000);  // Simulating a long-running task (5 seconds)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        logger.info("Task completed in thread: {}", Thread.currentThread().getName());
    }
}

✅ Explanation:

The @async annotation tells Spring to run executeAsyncTask() in a separate thread.
Thread.sleep(5000) simulates a 5-second delay, so the task runs in the background.

4️⃣ Create a Controller to Trigger Async Task

We create an API endpoint to trigger the async task.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class AsyncController {
    private final AsyncService asyncService;

    public AsyncController(AsyncService asyncService) {
        this.asyncService = asyncService;
    }

    @GetMapping("/start-task")
    public String startAsyncTask() {
        asyncService.executeAsyncTask();
        return "Async task started! You can continue doing other work.";
    }
}

✅ Explanation:

Calling /api/start-task will start an async task without blocking the request.
You will immediately receive a response, even though the task is still running in the background.
5️⃣ Run and Test the Application
1️⃣ Start the Spring Boot application
2️⃣ Call the API in a browser or Postman:

http://localhost:8080/api/start-task

3️⃣ Expected Output in Response:

Async task started! You can continue doing other work.

4️⃣ Console Output (Logs):

Task started in thread: SimpleAsyncTaskExecutor-1
(wait 5 seconds)
Task completed in thread: SimpleAsyncTaskExecutor-1

✅ Notice: The logs will print the thread name, confirming the method runs asynchronously in a different thread.