2017-03-13 212 views
1

我正在使用Jersey 2.25客戶端與Jackson,我在澤西配置一切正常,它在我的開發機器上正常工作,當我在測試類中運行它,但澤西客戶端永遠不會連接到部署在我們的STG環境中的特定主機,並且始終引發讀取超時異常。澤西客戶端給讀超時,但Apache HTTP客戶端正常連接

我也知道,這個問題是不是在我們的環境,因爲我可以連接使用curl

但是當切換到它的HTTPClient工作正常。

這是我們如何創造我們的Jersey客戶端:

Client client = ClientBuilder.newBuilder() 
      .register(JacksonFeature.class) 
      .property(ClientProperties.CONNECT_TIMEOUT,5000) 
      .property(ClientProperties.READ_TIMEOUT,15000) 
      .build(); 

這裏唯一的不同是應用程序的流程,也是發生在流動的重大變化,可能影響連接,即在什麼地方調用Jersey客戶端另一個類在系統中設置配置代理:

System.setProperty("http.proxyHost",strProxyHost); 
System.setProperty("http.proxyPort",strProxyPort); 
System.setProperty("https.proxyHost",strProxyHost); 
System.setProperty("https.proxyPort",strProxyPort); 

但是,我們可以建立連接正常使用了HTTPClient:

HttpConnectionManagerParams params = new HttpConnectionManagerParams(); 
params.setConnectionTimeout(5000); 
params.setSoTimeout(10000); 
HttpConnectionManager manager = new SimpleHttpConnectionManager(); 
manager.setParams(params); 
HttpClient httpClient = new HttpClient(manager); 

我們使用HTTPClient 3,因爲這個應用程序的一部分是遺留的,我們無法更新版本,但它正常工作。

什麼可能導致與澤西島的這種連接問題?當澤西試圖連接時,它有什麼全球性的東西?

回答

1

Jersey默認使用HttpURLConnectionHttpURLConnection用途以下爲代理服務器配置的全局設置 -

System.setProperty("http.proxyHost",strProxyHost); 
System.setProperty("http.proxyPort",strProxyPort); 
System.setProperty("https.proxyHost",strProxyHost); 
System.setProperty("https.proxyPort",strProxyPort); 

這意味着,如果這些系統變量設置,新澤西州將發送通過這個配置代理的所有請求。檢查詳細信息here

但是,Apache HttpClient不遵循這些設置。要在Apache HttpClient中使用代理,您必須使用HostConfiguration class。檢查詳細信息here

因此,現在到您的問題,它看起來您的STG環境不能連接到指定的代理,但能夠直接與服務連接。

因此,在使用Jersey時,客戶端無法連接到代理服務器,因此ReadTimeoutException正在發生。由於您尚未配置HttpClient以使用任何代理,因此可以直接與服務連接。

+0

我們可以重寫這個嗎? – engma