При отсутствии в контексте бина Executor
, Spring Boot автоматически конфигурирует ThreadPoolTaskExecutor
с адекватными значениями по умолчанию, которые могут быть автоматически связаны с асинхронным выполнением задач (аннотация @EnableAsync
) и асинхронной обработкой запросов в Spring MVC.
Если вы определили кастомный Executor
в контексте, при обычном выполнении задачи (то есть с аннотацией @EnableAsync
) он будет использоваться прозрачно, но средства поддержки Spring MVC не будут сконфигурированы, так как для этого требуется реализация AsyncTaskExecutor
(с именем applicationTaskExecutor
). В зависимости от вашей целевой организации, можно изменить Executor
на ThreadPoolTaskExecutor
или определить как ThreadPoolTaskExecutor
, так и AsyncConfigurer
, обертывающие ваш кастомный Executor
.
Автоконфигурируемый TaskExecutorBuilder
позволяет с легкостью создавать экземпляры, воспроизводящие то, что автоконфигурация делает по умолчанию.
Пул потоков использует 8 основных потоков, число которых может увеличиваться и уменьшаться в зависимости от нагрузки. Эти параметры по умолчанию можно точно настроить при помощи пространства имен spring.task.execution
, как показано в следующем примере:
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
spring:
task:
execution:
pool:
max-size: 16
queue-capacity: 100
keep-alive: "10s"
Этот код изменяет пул потоков для использования очереди с ограничением на длину, поэтому, если очередь заполняется (100 задач), пул потоков увеличивается до максимальных 16 потоков. Сокращение пула происходит более агрессивно, поскольку потоки восстанавливаются, если они простаивают в течение 10 секунд (а не 60 секунд по умолчанию).
Планировщик ThreadPoolTaskScheduler
также может быть автоматически сконфигурирован, если его необходимо связать с выполнением спланированных задач (например, с помощью аннотации @EnableScheduling
). Пул потоков по умолчанию использует один поток, но его параметры можно точно настроить с помощью пространства имен spring.task.scheduling
, как показано в следующем примере:
spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
spring:
task:
scheduling:
thread-name-prefix: "scheduling-"
pool:
size: 2
Бины TaskExecutorBuilder
и TaskSchedulerBuilder
доступны в контексте, если необходимо создать кастомный исполнитель или планировщик.