Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
Наука · 22 мая 2026 г.
📌 Spring Boot: Как использовать @Async и не напороться на проблемы?
📌 Spring Boot: Как использовать @Async и не напороться на проблемы? Сегодня я расскажу вам, как правильно использовать аннотацию @Async в Spring Boot, чтобы асинхронные задачи работали стабильно и без неожиданностей. 🔹 Что делает @Async? Эта аннотация позволяет выполнять методы в отдельном потоке, не блокируя основной поток приложения. Это удобно, когда нужно, например, отправить email или выполнить сложный расчет без задержки ответа пользователю. 🔹 Как правильно использовать? 1️⃣ Включите поддержку асинхронности Добавьте в главный класс Spring Boot: @EnableAsync @SpringBootApplication public class MyApplication { } 2️⃣ Аннотируйте метод в сервисе @Service public class EmailService { @Async public void sendEmail(String email) { System.out.println("Отправка email: " + email + " в потоке " + Thread.currentThread().getName()); } } 3️⃣ Вызывайте метод асинхронно @Component public class NotificationSender { private final EmailService emailService; public NotificationSender(EmailService emailService) { this.emailService = emailService; } public void notifyUser(String email) { emailService.sendEmail(email); System.out.println("Метод notifyUser выполняется в потоке " + Thread.currentThread().getName()); } } 🔹 Частые ошибки и их решения ❌ Вызываете асинхронный метод внутри того же класса? Spring не будет проксировать вызов, и @Async просто не сработает. Выносите метод в отдельный бин! ❌ Нет пула потоков? По умолчанию Spring использует SimpleAsyncTaskExecutor, который создает новый поток для каждой задачи. Это может перегрузить систему. Лучше явно указать пул: @Configuration @EnableAsync public class AsyncConfig { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(100); executor.initialize(); return executor; } } 👉 @BookJava