2013-01-04 92 views
1
HttpParams params = new BasicHttpParams(); 
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    HttpClient httpclient = new DefaultHttpClient(params); 
    HttpPost httppost = new HttpPost(address); 

    try { 
     // Execute HTTP Post Request 
     HttpResponse response = httpclient.execute(httppost); 
    } catch (IOException ex) { 
     logger.log(Level.SEVERE, null, ex); 
    } 

我使用此代碼段發送一個HTTP POST請求在Apache一個servlet Tomcat駐留在本地主機上。到Tomcat地址的發佈請求(沒有任何參數),即http://127.0.0.1:8084花費大約1000毫秒。雖然發送到地址爲http://127.0.0.1的Apache(wamp服務器)的相同請求僅需要20ms。POST請求127.0.0.1:8084/(Tomcat)的需要〜1000毫秒,而到127.0.0.1/(WAMP)需要20毫秒〜

我已經嘗試過使用Http版本(1.0/1.1),但響應時間沒有影響。

任何可能出錯的線索?或者如何改善這種表現?還是Tomcat本身如此之慢,我對這個問題無能爲力? (但後來的瀏覽器是能夠加載的servlet沒有任何顯著網絡延遲!)

附加信息:

此代碼本身就是一個Servlet這基本上是什麼都不做,但只是提出這個要求內。應該處理請求的servlet也是「空白」的。而且,整個場景中不涉及JSP。時間記錄不適用於冷靜的tomcat。第一次和(有時)第二次調用需要超過2000毫秒。但連續的請求被標準化爲超過1000毫秒。所以,這當然不是一個冷靜的tomcat問題。

現在,這裏的人們也問我servlet代碼。這裏是我正在處理的基本設計:

Servlet A應該做一些工作並使用我編寫的AgniLogger類進行記錄。 該類在庫中,計劃從幾個組件使用。它反過來使用上面的書面代碼發送POST請求到servlet B. Servlet B將執行實際的日誌記錄。現在,這個servlet B還沒有實現。 Servlet A和B是不同Web應用程序的一部分。

的Servlet答:http://pastebin.com/tQjtvG3g

AgniLogger:http://pastebin.com/nGJypmCN

的Servlet B:http://pastebin.com/psCxLCYY

P.S:我使用NetBeans開發和存在的項目沒有web.xml中爲止。

解決方法(雖然很怪異!)

如果我改變的processRequest的定義()在Servlet的B,從{空白}功能,這一點:

PrintWriter out = response.getWriter(); 
    try { 
     //do nothing 
    } finally { 
     out.close(); 
    } 

的問題得到解決。響應時間減少到20ms左右,就像80端口上的Apache(WAMP)服務器一樣。但是,我不知道爲什麼這個工作正常!

+1

請將這些「空白」servlet也添加到問題中,以防萬一它們有相關性。另外,你是否嘗試過在另一端計算它們,在servlet完成處理之後還是在它之前需要時間?另外,你的web.xml怎麼樣?它是否有過濾器或其他?請張貼也。 – eis

+0

發佈servlet。 – Subin

+0

用servlet代碼和web.xml信息更新了問題。 –

回答

2

你不明白你的servlet做什麼。例如,如果它在響應中嵌入了一個jsp,那麼jsp可能需要在第一次訪問時被編譯成一個servlet(實現jsps的方式)。在這種情況下嘗試第二個請求,這應該比第一個要快得多。

您也可以從「冷」tomcat請求頁面,例如,並非所有事情都已初始化 - 與第一種選擇類似,這將執行一些不會出現在稍後請求上的一次性操作。

當我們將Web或應用程序服務器配置爲解析客戶端的IP地址(進入反向查找DNS地址)時,我也看到過這種行爲。如果失敗,通常需要一段時間 - 並且此操作在過去一直阻止該請求。 (澄清了這一點:我已經看到webservers反向解析他們的日誌文件的IP地址,這成功的地方相對較快(但帶有價格),但是當請求的IP地址無法解析時,它被記錄爲IP(正如你所期望的那樣),但是在請求的回答時間內也出現了嚴重的滯後現象。我不指望任何應用服務器被配置成開箱即用,但我在過去看到過這個問題,缺點是如果你只是看到滯後和日誌中的IP地址,可能很難判斷你是否正在遭受這種情況,只有清楚你是否看到DNS名稱混合在各種請求主機的日誌中有IP地址)

另外,您以「127.0.0.1」爲例 - 在ca如果這不是真正的地址,請確保兩種方式都可以訪問相同的端點。例如。 「localhost」現在常見於「:: 1」(本地IPV6地址),但不是「127.0.0.1」(IPV4本地地址)。並不是說我會希望通過這兩種方式訪問​​該servlet產生顯着差異,但是如果您可以確定兩種訪問選項之間的不同路線,那麼您可能會更接近找到潛在問題。

+0

感謝您的回覆。但是沒有涉及JSP,也不是冷酷的tomcat。檢查我上面添加的其他信息。 您能否提供一些關於「何時將Web或應用程序服務器配置爲解析客戶端的IP地址(進入反向查找DNS地址)」的線索?這是我還沒有檢查過的東西。 –

+0

是否這樣? (見附加段落) –

+0

對於apache tomcat,我應該在哪裏尋找這個配置?有關於此的任何線索? –