web-dev-qa-db-fra.com

Spring @Async limite le nombre de threads

Ma question est très similaire à celle-ci: @ Async empêche un thread de continuer jusqu'à ce que l'autre thread soit terminé

Fondamentalement, j'ai besoin d'exécuter ~ des centaines de calculs dans plus de threads. Je veux exécuter seulement une certaine quantité de threads parallèles, par exemple 5 threads avec 5 calculs en parallèle.

J'utilise le framework Spring et l'option @Async est un choix naturel. Je n'ai pas besoin d'une file d'attente JMS complète, c'est un peu trop pour moi.

Des idées ? Je vous remercie

26
Martin V.

Avez-vous vérifié Task Executor? Vous pouvez définir un pool de threads, avec un nombre maximum de threads pour exécuter vos tâches.

Si vous souhaitez l'utiliser avec @Async, utilisez ceci dans votre configuration de printemps:

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

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

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

Référence complète ici (25.5.3). J'espère que cela t'aides.

17
jelies

Si vous utilisez la configuration Java de Spring, votre classe de configuration doit implémenter 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;
    }
}

Voir @EnableAsync documentation pour plus de détails: http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html

29
Siggen