2011-04-25 41 views
1

我在web應用程序中使用apache http客戶端(版本3.0,因爲我們有java 1.4並且無法更改它)。 我有用於向服務器發送POST請求的組件(類),並且此組件用於JSP頁面,即來自不同線程。如何爲Web應用程序配置apache http客戶端v3.0(多線程)

於是我在該組件的一些init()方法創建的客戶只有一次:

HttpClient client = 
      new HttpClient(new MultiThreadedHttpConnectionManager()); 
    client.getHostConfiguration().setProxy(proxyHost, proxyPortInt.intValue()); 
    HttpState state = new HttpState(); 
    state.setProxyCredentials(new AuthScope(proxyHost, proxyPortInt.intValue()), 
      new UsernamePasswordCredentials(username, userpassword)); 
    client.setState(state); 

,然後在方法使用它,可以是訪問在多個線程:

PostMethod method = new PostMethod(urlStr); 
method.setRequestEntity(new StringRequestEntity(requestStr)); 
method.setRequestHeader("Host", "the_same_host_every_time "); 
method.setRequestHeader("Content-Type", "application/soap+xml"); 
method.setRequestHeader("Content-Length", String.valueOf(requestStr.length())); 
InputStream responseStream = null; 
try { 
    int resultCode = client.executeMethod(method); 
    responseStream = method.getResponseBodyAsStream(); 
... 

這個應用程序每次向同一主機發出請求。 MultiThreadedHttpConnectionManager具有以下屬性:

  1. DEFAULT_MAX_HOST_CONNECTIONS 每個主機允許的連接的默認最大數量(每RFC 2616部分8.1.4,這個值缺省爲2.)
  2. DEFAULT_MAX_TOTAL_CONNECTIONS 連接的默認最大數量整體允許

我沒有改變它們。這是否意味着我的應用程序將能夠同時執行最大2個請求(因爲它們都是同一個主機)?爲什麼默認值是2?我應該更改DEFAULT_MAX_HOST_CONNECTIONS值(這個應用程序有很多用戶可以同時訪問JSP)。什麼是關於DEFAULT_MAX_TOTAL_CONNECTIONS,這個參數對我的應用很重要?

在此先感謝!

+0

「我應該改變」,「對我的應用程序非常重要」?只有你能知道什麼對你很重要。試試吧,看看它是否讓你的事情變得更好。 – Mat 2011-04-25 07:07:14

+0

我們不能嘗試,我們只提供我們的客戶幾個組件,但沒有完整的應用程序來測試。我只是試圖瞭解這個參數是什麼意思,什麼是最佳實踐。 – Mikhail 2011-04-25 07:10:01

+0

如果您無法從1.4升級,則可以使用retroweaver將應用程序從新版本轉換爲1.4。 – 2011-04-25 07:12:26

回答

1

我們前一段時間有過類似的場景,並使用了

  • 使用多線程的關鍵點MultiThreadedHttpConnectionManager(你已經這樣做)的HttpMethod
  • 共享實例(例如GetMethod)和HttpState之間的線程

HttpState封裝後續請求之間的會話狀態in包括會話ID(如果有的話)。因此,當試圖對某種「後端」(例如網站)執行併發請求時,您不希望在線程之間共享它,以免混淆會話並獲得不可預知的結果。

參考文檔有一個chapter on threading以及一個名爲"Concurrent execution of HTTP Methods"的部分。前面解釋了你提到的配置參數,後者一般用於多線程。

相關問題