2016-10-14 63 views
1

我在做什麼錯當@Asynch方法@Service獨立Spring Boot應用程序中的註釋類不會異步運行?Spring中的@Async在Service類中不起作用?

當我運行它時,直接從主類(@SpringBootApplication註釋)在作品中直接相同的方法。例如:

主類

@SpringBootApplication 
    @EnableAsync 
    public class Application implements CommandLineRunner { 

    @Override 
    public void run(String... args) throws Exception { 
// here when I call downloadAnSave() it runs asynchronously... 
// but when I cal downloadAnSave() via downloadAllImages() it does not run asynchronously... 
} 

    } 

和我服務類(這裏異步行爲不工作):從同一個類中

 @EnableAsync 
     @Service 
     public class ImageProcessorService implements IIMageProcessorService { 

public void downloadAllImages(Run lastRun){ 
// this method calls downloadAnSave() in loop and should run asynchronously.... 
} 

     @Async 
     @Override 
     public boolean downloadAnSave(String productId, String imageUrl) { 
    // 
    } 

     } 
+1

[控制器中的Spring Boot @Async方法正在同步執行]的可能副本(http://stackoverflow.com/questions/29284008/spring-boot-async-method-in-controller-is-executing-synchronously) – g00glen00b

+0

問題本身似乎並不完全重複,但同樣的答案(和評論)適用於此。 – g00glen00b

回答

4

調用異步方法會觸發原始方法而不是截取的方法。 您需要使用異步方法創建另一個服務,然後從您的服務調用它。

Spring爲使用常用註釋創建的每個服務和組件創建一個代理。只有那些代理包含方法註釋定義的想要的行爲,例如Async。因此,不通過代理而是通過原始裸類調用這些方法不會觸發這些行爲。

+0

謝謝,我會試試看。澄清和我的信息,請你能解釋你的意思是「會觸發原始方法而不是被截取的方法」嗎?謝謝。 – Artegon

相關問題