2014-12-04 62 views
1

我讀書用SpringMVC文檔和我stucked異步部分:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-async春季異步與Callable工作和我不明白?

我創造了非常簡單的項目(春4,爪哇8)這樣的控制器如下:

@Controller 
public class HomeController { 

    @RequestMapping("/async") 
    public Callable<String> async() { 
     logger.info("Async IN, {}", new Date()); 
     return() -> { 
      Thread.sleep(5000); 
      return "home"; 
     }; 
    } 

    @RequestMapping("/sync") 
    public String sync() throws Exception { 
     logger.info("Sync IN, {}", new Date()); 
     Thread.sleep(5000); 
     return "home"; 
    } 

} 

我已經啓用了異步功能在Servlet中 - 如文檔中所述。現在我打電話要求,首先是/sync,其次是/async。相繼。他們全都是在醫務室內派遣的。 Spring應用程序不會等待/sync結束,然後纔會開始處理/async請求。請求後我會在同一時間得到回覆。

它看起來像這樣:

INFO : com.mydlarz.springtt.HomeController - Sync IN, Thu Dec 04 17:00:18 CET 2014 
INFO : com.mydlarz.springtt.HomeController - Async IN, Thu Dec 04 17:00:19 CET 2014 
INFO : com.mydlarz.springtt.HomeController - Async IN, Thu Dec 04 17:00:29 CET 2014 
INFO : com.mydlarz.springtt.HomeController - Sync IN, Thu Dec 04 17:00:29 CET 2014 

這是爲什麼?第一次SYNC後約5秒不應啓動第二個請求處理?

回答

1

同步和異步是針對Servlet容器使用的線程。同步請求將使用該線程,並在必要時阻止該線程完成其他操作。一個異步請求將使用該線程,但不會阻止它。操作將轉移到可能發生阻塞的另一個線程。

這是爲什麼?第一次SYNC後約5秒不應啓動第二個請求處理?

如果您的Servlet容器中包含4個以上的線程(很有可能),那麼您的4個請求都不會等待其他任何請求。

+0

我可以在哪裏指定Servlet容器中的線程數? – dmydlarz 2014-12-04 16:16:41

+0

@DariuszMydlarz沒有標準的方法來做到這一點。這取決於你的Servlet容器。 – 2014-12-04 16:17:25

+1

@DariuszMydlarz你可以做什麼來模擬獲得備份的請求,是在每個方法的前面添加'synchronized',即'public synchronized String sync()'。但是不要將「同步」放入生產環境中。 – 2014-12-04 16:57:09