2013-10-13 242 views
1

我想讓我的控制器(Spring MVC)並行處理請求。我在下面使用@Callable,它不起作用,因爲下一個請求從第一個請求完成(返回視圖)開始處理。請求異步處理不起作用

@RequestMapping(method = RequestMethod.GET) 
public Callable<String> helloWorld(final Model model) throws InterruptedException { 
    return new Callable<String>() { 
     @Override 
     public String call() throws Exception { 
      Thread.sleep(5000); 
      return "helloWorld"; 
     } 
    }; 
} 

我需要任何特殊的代碼嗎?

+0

你的期望是什麼? –

+0

當Callable返回時,第二個請求觸發helloWorld。但實際上它等到第一個可調用的返回「helloWorld」。 – pawb4r

回答

2

documentation for Spring MVC狀態有關Callable<?>返回類型爲以下處理方法

可贖回可當應用程序需要異步產生 由Spring MVC的管理線程的返回值返回。

春天將返回Callable例如,它傳遞給一個ExecutorService(實際上沒有更多的處理則比,但是爲了簡單),並在不同的Thread那麼你的初始請求執行它。等待5秒後,它將返回與視圖名稱"helloWorld"關聯的視圖。

+0

我可以看到callable是在其他線程中處理的,但爲什麼下一個請求必須等待第一個端點在另一個線程中被處理。我認爲整個請求將並行處理... – pawb4r

+0

如何理解此文檔片段? 像往常一樣,控制器方法現在可以返回java.util.concurrent.Callable並從單獨的線程產生返回值,而不是像往常一樣返回值。同時,主Servlet容器線程被釋放並允許處理其他請求。 – pawb4r

+3

@ pawb4r它工作正常。只是不要在同一瀏覽器上嘗試這兩個請求。例如,chrome會意識到它正在發送相同的請求,並且一次只發送一個請求。 –