2016-07-14 7 views
11

Ich habe eine @Service Klasse in Spring Boot-Anwendung mit einer der Methoden, die asynchron ausgeführt werden sollten. Wie ich die Methode lese sollte @Async kommentiert werden und ich muss auch eine TaskExecutor Bean laufen lassen. Aber im Frühjahr Handbuch http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Ich finde keine Informationen oder ein Beispiel, wie man TaskExecutor mit Annotation, ohne XML-Konfiguration ausführen. Ist es möglich, TaskExecutor Bean im Spring Boot ohne XML zu erstellen, nur mit Anmerkungen? Hier meine Service-Klasse:Spring Boot. Wie erstelle ich TaskExecutor mit Annotation?

@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()); 
    } 
} 

Antwort

20

hinzufügen @Bean Methode Ihrer Spring-Boot-Anwendung Klasse:

@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) { 
     // ... 
    } 
} 

Siehe Java-based container configuration im Spring Framework Referenzdokumentation auf, wie Spring mit Java Config statt XML zu konfigurieren.

(Hinweis: Sie müssen der Klasse @Configuration nicht hinzufügen, da @SpringBootApplication bereits @Configuration enthält).

+0

ich erstellen, wie Sie erwähnen und es macht eine Bohne (ich kann‚@Autowire‘es in meinem Test-Klasse jus t zu wissen, dass es existiert), aber meine Service-Methode läuft nicht asynchron. Hier meine Methodenbeschreibung: "@Bean public TaskExecutor locationPageExecutor()". Könnten Sie kommentieren? – Pavlo

+0

Irgendwie sieht es so aus, als hätten Sie meine erste Frage beantwortet, also werde ich versuchen, ein neues Problem zu lösen. Vielen Dank. – Pavlo

+0

@Pavlo Sie müssen Ihrer Spring-Boot-App-Klasse auch '@ EnableAsync' hinzufügen, siehe: [Zeitplanbenachrichtigungen aktivieren] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html /scheduling.html#scheduling-enable-annotation-support) – Jesper

2

Erste - lassen Sie sich über die Regeln gehen - @Async hat zwei Einschränkungen:

  • es muss nur
  • Selbst Aufruf an öffentliche Methoden angewandt werden - von der Asynchron-Methode aus der gleichen Klasse aufrufen - won ‚t arbeiten

so Ihre processPage() -Methode in separaten Klasse sein sollte

+0

@Async muss nicht öffentlich sein (zumindest nicht mehr) –