2015-04-16 25 views
0

我在調用頁面時使用異步調用來減少客戶端的一些等待時間。@Async帶註釋的方法在控制器調用時不會異步操作

作爲一個實驗,我有一個控制器,用@Async註解的方法調用pojo。在那個大使館裏,我睡了10000毫秒進行模擬操作,以測試我的理論是否有效,似乎不是。下面的代碼和進一步的信息可以後發現:

測試控制器

@Conroller 
public class TestController { 
@RequestMapping("/test") 
public String testAsyncCall() { 

new AsyncTestClass().asyncOpOne(); 

return "secondpage"; 
} 
} 

異步類包含@Async註解的方法

public class AsyncTestClass { 
@Async 
public void asyncOpOne() { 
try { 
     Thread.sleep(10000); 
     System.out.println("done working"); 
    } catch (InterruptedException e) { 
     // 
    } 
} 
} 
從我的理解

現在客戶端發出呼叫時, 「/測試」在他們的瀏覽器控制器應該返回調用異步方法,並立即返回「第二頁」被渲染。

發生了什麼事是控制器返回第二頁,直到異步調用中的10000毫秒完成後才返回第二頁。

FYI @EnableAsync被添加到我的一個配置文件(使用Java配置)。

我在這裏做錯了什麼,導致控制器在繼續之前等待異步完成其睡眠?

+2

您沒有使用Spring配置的實例,但正在自己構建一個新的實例...使用由spring配置的實例。 –

+0

@ M.Deinum你能澄清一下,我不明白你的意思嗎 – Aeseir

+1

你正在做'新的AsyncTestClass'這意味着你正在自己構建一個實例,而不是在spring的控制之下,所以基本上你的'@ Async'是沒用的。爲'AsyncTestClass'添加一個bean,並將其注入到控制器中。 –

回答

4

Spring使用AOP將@Async行爲應用於您的bean(例如,同樣適用於@Transactional)。

Spring只會將AOP應用於它所知道的bean,因爲您正在構建Spring範圍之外的新實例,因此@Async什麼都不做。只需將它作爲一個bean添加到您的配置中並將其注入到您的控制器中即可。

@Bean 
public AsyncTestClass asyncTestClass() { 
    return new AsyncTestClass(): 
} 

然後在你的調用類中。

@Conroller 
public class TestController { 

    @Autowired 
    private AsyncTestClass asyncTestClass; 

    @RequestMapping("/test") 
    public String testAsyncCall() { 

     asyncTestClass.asyncOpOne(); 
     return "secondpage"; 
    } 
} 
相關問題