web-dev-qa-db-fra.com

Botte de printemps. Comment créer TaskExecutor avec Annotation?

J'ai fait un @Service classe dans l'application Spring Boot avec l'une des méthodes devant s'exécuter de manière asynchrone. Comme je lis la méthode devrait être @Async annoté et je dois aussi exécuter un bean TaskExecutor. Mais dans le manuel de printemps http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Je ne trouve aucune information ni exemple d'utilisation de TaskExecutor avec annotation, sans configuration XML. Est-il possible de créer TaskExecutor bean dans Spring Boot sans XML, avec uniquement des annotations? Voici ma classe de service:

@Service
public class CatalogPageServiceImpl implements CatalogPageService {

    @Override
    public void processPagesList(List<CatalogPage> catalogPageList) {
        for (CatalogPage catalogPage:catalogPageList){
            processPage(catalogPage);
        }
    }

    @Override
    @Async("locationPageExecutor")
    public void processPage(CatalogPage catalogPage) {
        System.out.println("print from Async method "+catalogPage.getUrl());
    }
}
20
Pavlo

Ajouter un @Bean méthode à votre classe d'application Spring Boot:

@SpringBootApplication
@EnableAsync
public class MySpringBootApp {

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        return executor;
    }

    public static void main(String[] args) {
        // ...
    }
}

Reportez-vous à la section Configuration du conteneur Java dans la documentation de référence de Spring Framework pour savoir comment configurer Spring à l'aide de Java config au lieu de XML.).

(Remarque: vous n'avez pas besoin d'ajouter @Configuration à la classe parce que @SpringBootApplication comprend déjà @Configuration).

34
Jesper

Tout d’abord - examinons les règles - @Async a deux limitations:

  • il ne doit être appliqué qu'aux méthodes publiques
  • invocation automatique - appeler la méthode async à partir de la même classe - ne fonctionnera pas

Donc, votre méthode processPage () doit être dans une classe séparée

6
Igor Shevchenko