2016-07-14 95 views
11

Spring Boot uygulamasında, eşzamansız olarak çalışması gereken yöntemlerden biriyle @Service sınıfı yaptım. Okuduğum gibi yöntem @Async açıklamalı ve ayrıca TaskExecutor fasulye çalıştırmam gerekiyor. Ancak, http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html no'lu yayında, XML yapılandırması olmadan ek açıklama içeren TaskExecutor'un nasıl çalıştırılacağı hakkında herhangi bir bilgi veya örnek bulamıyorum. XML olmadan Spring Boot'da TaskExecutor bean oluşturmak sadece ek açıklamalarla mı? İşte benim Servis sınıfı:Yay önyükleme. Ek Açıklama ile TaskExecutor nasıl oluşturulur?

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

cevap

20

sizin Bahar Önyükleme uygulama sınıfına bir @Bean yöntemi ekleyin:

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

Bahar Java yapılandırma yerine XML kullanarak nasıl yapılandırılacağı ile ilgili İlkbahar Çerçeve referans belgelerinde Java-based container configuration bakın.

(Not: zaten @Configuration içeriyorsa, sınıfa @Configuration eklemeniz gerekmez).

+0

Sözünü gibi oluşturmak ve fasulye (yapar elimden '@Autowire' o benim test sınıfı jus Bunu bilmek için t), ancak hizmet yöntemim eşzamansız olarak çalıştırılmıyor. İşte benim yöntem açıklaması: "@Bean Public TaskExecutor locationPageExecutor()". Yorum yapabilir misin? – Pavlo

+0

Herhangi bir şekilde ilk sorumu cevapladınız gibi görünüyor, bu yüzden yeni sorunu nasıl çözeceğime bakacağım. Teşekkürler. – Pavlo

+0

@Pavlo Ayrıca, Spring boot uygulama sınıfınıza '@ EnableAsync' eklemek zorundasınız, bakınız: [Zamanlama açıklamalarını etkinleştir] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html /scheduling.html#scheduling-enable-annotation-support) – Jesper

2

İlk - kurallarına üzerinden geçelim - @Async iki sınırlamaları vardır: - aynı sınıf içinde zaman uyumsuz yöntemini çağırarak - won

    kamu yöntemlerle sadece
  • kendini çağırma uygulanmalıdır
  • 't

Yani processPage() metodu ayrı sınıfta olmalıdır çalışmak

+0

@Async'in herkese açık olması gerekmiyor (en azından artık gerek yok) –