Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 440новых вакансий за сутки·54 706вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 625
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 397 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 748
  • Облачные технологии6 616
  • QA вакансии2 169
  • Android1 320
  • Инженер данных872
  • Продакт-менеджер302

Разработка

  • iOS1 232
  • Backend вакансии1 204
  • AI вакансии543
  • Fullstack вакансии497
  • Frontend вакансии417
  • Mobile вакансии28

По стеку

  • Go5 212
  • Java3 116
  • Kotlin1 090
  • Node.js995
  • Rust845
  • .NET661
  • PHP320
  • C++271
  • C#208

DevOps и инфраструктура

  • Kubernetes3 913
  • Linux-инфраструктура2 852
  • DevOps вакансии2 678
  • Terraform / IaC2 167
  • Мониторинг и Observability1 066
  • CI/CD923
  • SRE301
  • Кибербезопасность26

Аналитика и данные

  • Аналитик данных533
  • Data Scientist436
  • Бизнес-аналитик400
  • Системный аналитик68

Другие направления

  • Проджект-менеджер90
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Spring BootВсе вопросы
Spring BootMiddleКодинг

Как реализовать асинхронную обработку в Spring Boot с помощью @Async?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

@Async работает через AOP-прокси: Spring перехватывает вызов и отправляет его в TaskExecutor. Требуется @EnableAsync и вызов метода через Spring-бин (не this.method()), иначе прокси не срабатывает.

Минимальная настройка

@SpringBootApplication
@EnableAsync   // активирует async-инфраструктуру
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Как работает @Async

Spring создаёт CGLIB-прокси вокруг бина с @Async-методами. При вызове метода прокси перехватывает его, оборачивает в Callable и передаёт в TaskExecutor. Оригинальный поток возвращает управление немедленно; метод исполняется в пуле потоков.

Метод может возвращать void, Future<T> или CompletableFuture<T>.

Настройка пула потоков

@Configuration
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor exec = new ThreadPoolTaskExecutor();
        exec.setCorePoolSize(4);
        exec.setMaxPoolSize(16);
        exec.setQueueCapacity(200);
        exec.setThreadNamePrefix("async-");
        // CallerRunsPolicy: если очередь заполнена — выполняет в вызывающем потоке
        exec.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        exec.initialize();
        return exec;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) ->
            LoggerFactory.getLogger(getClass())
                .error("Async error in {}: {}", method.getName(), ex.getMessage(), ex);
    }
}

Сервис с @Async

@Service
public class ReportService {

    // void — fire-and-forget
    @Async
    public void generateReport(Long userId) {
        // долгая операция: PDF, email...
        log.info("Generating for user {} in thread {}",
            userId, Thread.currentThread().getName());
    }

    // CompletableFuture — можно дождаться результата
    @Async
    public CompletableFuture<String> fetchExternalData(String url) {
        String result = restClient.get().uri(url).retrieve().body(String.class);
        return CompletableFuture.completedFuture(result);
    }
}

Использование в контроллере

@RestController
@RequiredArgsConstructor
public class ReportController {

    private final ReportService reportService;

    @PostMapping("/reports")
    public ResponseEntity<Void> trigger(@RequestParam Long userId) {
        reportService.generateReport(userId);  // возвращается сразу
        return ResponseEntity.accepted().build(); // 202
    }
}

Тест асинхронного метода

@SpringBootTest
class ReportServiceTest {

    @Autowired
    private ReportService service;

    @Test
    void fetchExternalData_returnsResult() throws Exception {
        CompletableFuture<String> future = service.fetchExternalData("https://example.com");
        String result = future.get(5, TimeUnit.SECONDS);
        assertThat(result).isNotBlank();
    }
}

Подводные камни

  • Вызов через this — прокси не срабатывает: если внутри того же класса вызвать this.generateReport(), AOP-перехват не происходит и метод выполняется синхронно. Решение: выделить async-метод в отдельный бин.
  • private-методы игнорируются: CGLIB не может переопределить приватный метод. @Async на private-методе молча не работает.
  • void + исключение = тихая смерть: если метод возвращает void и бросает исключение, оно не дойдёт до вызывающего. Обязательно настройте AsyncUncaughtExceptionHandler.
  • Неограниченная очередь = OutOfMemoryError: дефолтный SimpleAsyncTaskExecutor создаёт новый поток на каждый вызов без лимита. В продакшне всегда используйте ThreadPoolTaskExecutor с ограниченной очередью.
  • SecurityContext не передаётся автоматически: в async-потоке SecurityContextHolder пуст. Нужно явно настроить DelegatingSecurityContextAsyncTaskExecutor.
  • @Transactional + @Async = разные транзакции: async-метод выполняется в новом потоке без транзакции вызывающего. Транзакцию нужно открывать внутри async-метода.
  • Readiness probe в Kubernetes: долгий async-метод, запущенный при старте через ApplicationRunner, может задержать сигнал готовности. Всегда разграничивайте инициализацию и обработку запросов.
  • Мониторинг пула: без метрик пул незаметно насыщается. Подключите Actuator (management.endpoints.web.exposure.include=metrics) и наблюдайте executor.active, executor.queued.

Частые вопросы на собеседовании

  • Как реализовать health checks в Spring Boot Actuator?
  • Что делает аннотация @SpringBootApplication?
  • Что такое Spring Boot и чем он отличается от Spring Framework?
  • В каких backend-проектах Spring Boot является сильным выбором, а где лучше выбрать более простой или другой стек?

Типичные ошибки

  • Путать термин «boot async» с соседним механизмом Spring Boot.
  • Не называть границу lifecycle, transaction, thread или request для «boot async».
  • Игнорировать production-эффекты «boot async»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «boot async» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «boot async».
  • Уточнить, какие настройки или API меняют «boot async» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Spring Boot →

Источники

  • https://docs.spring.io/spring-framework/reference/integration/scheduling.html

Связанные темы

Spring Bootbackend-designconcurrency-debuggingimplementation

Вакансии с этим навыком

  • Senior Java Software Engineer
  • CTO / Java Backend Developer
  • Backend-разработчик (Java/Kotlin)
  • IT Specialists: Cybersecurity, CPO, Java Backend Developer
  • Senior Software Engineer