Spring @Асинхронное ограничение количества потоков
Мой вопрос очень похож на этот: @Async предотвращает продолжение потока до тех пор, пока не закончится другой поток
В основном мне нужно запустить ~ сотни вычислений в большем количестве потоков. Я хочу запустить только некоторое количество параллельных потоков, например. 5 потоков с 5 вычислениями в параллеле.
Я использую spring framework, а опция @Async - естественный выбор. Мне не нужна полнофункциональная JMS-очередь, для меня это немного накладные расходы.
Любые идеи?
Спасибо вам
Ответы
Ответ 1
Вы проверили Task Executor
? Вы можете определить пул потоков с максимальным количеством потоков для выполнения ваших задач.
Если вы хотите использовать его с @Async
, используйте его в spring -config:
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
Полная ссылка здесь (25.5.3). Надеюсь, это поможет.
Ответ 2
Если вы используете Spring Java-конфигурацию, ваш класс конфигурации должен реализовывать AsyncConfigurer
:
@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {
[...]
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
}
Подробнее см. документацию @EnableAsync
: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html
Ответ 3
Начиная с весенней загрузки 2.1 вы можете использовать автоконфигурацию и изменять максимальное количество потоков в файле свойств приложения
spring.task.execution.pool.max-size=4
Смотрите полную документацию:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-task-execution-scheduling