2016-07-14 64 views
11

Ho eseguito una classe @Service nell'applicazione Spring Boot con uno dei metodi che dovrebbero essere eseguiti in modo asincrono. Come ho letto il metodo dovrebbe essere @Async annotato e anche io devo eseguire un bean TaskExecutor. Ma nel manuale di primavera http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html non ho trovato alcuna informazione o esempio su come eseguire TaskExecutor con annotazione, senza configurazione XML. È possibile creare il bean TaskExecutor in Spring Boot senza XML, con solo annotazioni? Qui la mia classe di servizio:Avvio a molla. Come creare TaskExecutor con annotazione?

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

risposta

20

aggiungere un metodo @Bean alla vostra classe di applicazione Stivale Primavera:

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

Vedi Java-based container configuration nella documentazione di riferimento Spring Framework su come configurare Spring utilizza config Java invece di XML.

(Nota: non è necessario aggiungere @Configuration alla classe perché include già @Configuration).

+0

creo come si parla e mi fa un fagiolo (posso '@Autowire' nella mia classe di test jus per sapere che esiste), ma il mio metodo di servizio non viene eseguito in modo asincrono. Ecco la mia descrizione del metodo: "@Bean public TaskExecutor locationPageExecutor()". Potresti commentare? – Pavlo

+0

In qualsiasi modo sembra che tu abbia risposto alla mia domanda iniziale, quindi vedrò come risolvere il nuovo problema. Grazie. – Pavlo

+0

@Pavlo È inoltre necessario aggiungere '@ EnableAsync' alla classe dell'app di avvio Spring, consultare: [Abilita annotazioni di pianificazione] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html /scheduling.html#scheduling-enable-annotation-support) – Jesper

2

In primo luogo - Andiamo oltre le regole - @Async ha due limitazioni:

  • deve essere applicato a metodi pubblici solo
  • auto-invocazione - chiamando il metodo asincrono all'interno della stessa classe - Won 't lavorare

Quindi il metodo vostra processPage() dovrebbe essere in classe separata

+0

@Async non è necessario che sia pubblico (almeno non è più necessario) –

Problemi correlati