Spring @Async ограничава броя на нишките

Въпросът ми е много подобен на този: @ Async предотвратява продължаването на нишка, докато друга нишка не приключи

По принцип трябва да изпълня ~ стотици изчисления в повече нишки. Искам да стартирам само известно количество паралелни нишки, напр. 5 нишки с 5 изчисления са паралелно.

Използвам пролетна рамка и опцията @Async е естествен избор. Нямам нужда от пълнофункционална JMS опашка, това е малко излишно за мен.

Някакви идеи ? Благодаря ти


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


Отговори (3)


Напуснахте ли Task Executor? Можете да дефинирате Thread Pool с максимален брой нишки за изпълнение на вашите задачи.

Ако искате да го използвате с @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). Надявам се това да помогне.

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