Spring @Async ограничивает количество потоков

Мой вопрос очень похож на этот: @ Async предотвращает продолжение потока, пока другой поток не завершится

В основном мне нужно запустить ~ сотни вычислений в большем количестве потоков. Я хочу запускать только некоторое количество параллельных потоков, например. 5 потоков с 5 вычислениями параллельно.

Я использую Spring Framework, и вариант @Async является естественным выбором. Мне не нужна полнофункциональная очередь JMS, это немного накладно для меня.

Есть идеи ? Спасибо


person Martin V.    schedule 03.11.2012    source источник


Ответы (3)


Вы проверили Task Executor? Вы можете определить пул потоков с максимальным количеством потоков для выполнения ваших задач.

Если вы хотите использовать его с @Async, используйте это в своей конфигурации spring:

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>

<task:executor id="myExecutor" pool-size="5"/>

<task:scheduler id="myScheduler" pool-size="10"/>

Полная ссылка здесь (25.5.3). Надеюсь это поможет.

person jelies    schedule 03.11.2012

Если вы используете Java-конфигурацию Spring, ваш класс конфигурации должен реализовать 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

person Siggen    schedule 07.05.2014
comment
что, если мне нужно несколько асинхронностей? - person Dejell; 21.04.2015
comment
Вы можете аннотировать несколько методов с помощью @Async, и они будут совместно использовать пул потоков/исполнитель, определенный с помощью @EnableAsync config. - person Siggen; 23.04.2015
comment
Я имею в виду - несколько исполнителей с разными конфигурациями для каждого - person Dejell; 23.04.2015
comment
Я никогда этого не делал, но думаю, что это возможно, если определить собственную аннотацию (например, @MyAsync1 и @MyAsync2), а затем использовать два @EnableAsync (в двух разных классах конфигурации) при указании параметра annotation: @EnableAsync(annotation = @MyAsync1.class) и @EnableAsync(annotation = @MyAsync2.class). См. документацию. класса @EnableAsync - person Siggen; 24.04.2015
comment
для наличия нескольких исполнителей с разными конфигурациями вы можете посмотреть ссылку: baeldung.com/spring-async. В разделе 4.1 рассказывается, как назвать исполнителя и использовать его как @Async(‹имя исполнителя›) - person Anoop Isaac; 08.09.2015
comment
Если я установлю емкость очереди на 50, которая заполнена, и предположу, что потоки размера основного пула не завершены, что произойдет с моей 51-й задачей? будет ли он отклонен или вызывающий метод Async будет ждать? - person KCK; 07.05.2019

Начиная с весенней загрузки 2.1 вы можете использовать автоматическую настройку и изменить максимальное количество потоков в файле свойств приложения.

spring.task.execution.pool.max-size=4

См. полную документацию:
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-task-execution-scheduling

person RenRen    schedule 03.10.2019