Heavy, time-consuming work like image processing should run asynchronously in Spring Boot, using @Async on a dedicated service method so the request thread isn't blocked waiting for it to finish.
Key Points: • @EnableAsync on a configuration class turns on Spring's asynchronous method execution support. • @Async on the processing method makes Spring run it on a separate thread from a configured executor, returning immediately to the caller. • A custom ThreadPoolTaskExecutor bean should be configured explicitly, since the default executor isn't tuned for CPU/IO-heavy workloads like image processing. • Returning a CompletableFuture<T> from the @Async method lets the caller track completion or chain further processing once the result is ready. • Monitoring queue size and thread pool utilization prevents the executor from silently backing up under sustained heavy load.
Example: A photo-upload endpoint saves the file and immediately returns a 202 Accepted response to the user, while a separate @Async method resizes and processes the image in the background and updates the record once finished.
Code Example:
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "imageExecutor")
public Executor imageExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}
}
@Async("imageExecutor")
public CompletableFuture<String> processImage(byte[] imageData) {
// heavy processing
return CompletableFuture.completedFuture("done");
}Interview Tip: A concise interview answer is:
"I'd enable @EnableAsync and mark the processing method @Async, backed by a dedicated ThreadPoolTaskExecutor sized for this kind of CPU-heavy work rather than the default executor. The endpoint returns immediately, and the method returns a CompletableFuture so callers can track completion without blocking the request thread."