2012-05-14 143 views
23

我一直在使用jetty/tomcat應用程序服務器使用spring web應用程序兩年多,但是仍然存在的問題是如何處理這些服務器中的多個請求。我明白春天對於製作單身人士很有幫助,但我的理解僅限於此。 有人可以指向任何可以幫助我理解如何處理多個請求的好資源。jetty如何處理多個請求

回答

27

這可以回答很多層面,我一直盯着它兩天試圖找出答案......所以我會採取一個高水平的拍攝。

有jetty偵聽的這個服務器端口和一些接受者線程,它們的工作是獲取客戶端和服務器端之間建立的連接對象。一旦你有了這個連接,它就會通過碼頭處理程序體系結構進行身份驗證,或者取消會話ID並將會話對象附加到請求中。然後它進入servlet處理程序並找到相應的servlet,然後開始處理servlet-api。此時,您在servlet-api中的所有時間都有一個線程分配給您的請求,至少在servlet 2.5下。在servlet 3.0中,您可以使用一些異步機制,也可以使用jetty-continuations作爲在servlet 2.5 api上獲得異步支持的方式。

無論如何,服務器使用線程池來將線程分配給那些最終是花費所有時間在servlet-api中的線程的連接器。 jetty continuation api和較新的servlet 3.0支持提供了將線程釋放回主線程池的機制,以便他們可以花時間接受和處理其他請求。

顯然還有很多關於使用nio api的內容,以及jetty如何有效地管理所有這些東西,但也許這足以滿足您最初的問題。如果沒有,請隨時仔細閱讀碼頭文件(http://www.eclipse.org/jetty/documentation/current)或查看碼頭郵件列表。關於jetty-9優化方面的一些討論涉及到Webtide博客中的http,spdy和websocket連接處理和處理(http://webtide.com/blogs)。

+0

儘管我非常感謝您提供的見解。我仍然對一件事感到好奇。如果有一個正在等待執行的請求的線程池,那麼當前只有一個線程正在通過我在春季編寫的一段webapp代碼,或者可能有這個代碼的多個副本,並且我可以有多個請求被送達 –

+1

servlet不是線程安全的,並且多個線程可以通過相同的service()或doPost()方法,「狀態」保留在方法和線程本身的變量中。儘管您可以讓servlet自己聲明並管理同步事物,但通常不希望您的servlet是單線程的,但整個想法是能夠同時處理多個請求,而當您有線程阻塞像servlet一樣簡單的東西。 –