2010-06-10 83 views
10

我必須實現一個web服務客戶端到一個給定的WSDL文件。 我使用SDK的'wsimport'工具從WSDL創建Java類以及將web服務的唯一方法(enhanceAddress(auth, param, address))封裝到簡單的java方法中的類。到現在爲止還挺好。 webservice功能正常,返回結果正確。代碼如下所示:在java web服務客戶端連接的詳細信息和超時

try { 
    EnhancedAddressList uniservResponse = getWebservicePort().enhanceAddress(m_auth, m_param, uniservAddress); 
    //Where the Port^ is the HTTP Soap 1.2 Endpoint 
}catch (Throwable e) { 
    throw new AddressValidationException("Error during uniserv webservice request.", e); 
} 

現在的問題:我需要得到有關的連接,以及可能發生,爲了充實各種JMX值的任何錯誤信息(如COUNT_READ_TIMEOUT,COUNT_CONNECT_TIMEOUT,...) 不幸的是,該方法沒有正式拋出任何異常,因此爲了獲得有關ConnectException的詳細信息,我需要在ClientTransportException上使用getCause()這將拋出。

更糟糕的是:我試圖測試讀取超時值,但沒有。我在wsdl文件中更改了服務的位置,將請求發送到一個只等到永遠不會返回的php腳本。猜猜看:Web服務客戶端不是超時,但也一直在等待(我在等待30多分鐘後殺死了應用程序)。這對我的應用程序來說不是一個選項,因爲如果我終於用完了TCP連接,如果它們中的一些被卡住了。

enhanceAddress(auth, param, address)方法未實現,但用javax.jws註釋。*註解,這意味着我無法查看/更改/檢查實際執行的代碼。

我有什麼選擇,但要扔掉整個wsimport/javax.jsw東西,並實施我自己的肥皂客戶端?

回答

14

設置讀取超時和連接超時可以配置參數綁定,當你設置你的服務和端口實例:


Service = new Service(); 

    Port = Service.getPort(); 

    ((BindingProvider) Port).getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
      "http://localhost:8080/service"); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.CONNECT_TIMEOUT, 
      30); 
    ((BindingProvider) Port).getRequestContext().put(
      BindingProviderProperties.REQUEST_TIMEOUT, 
      30); 

現在

,只要你通過「端口」執行服務如果後端響應速度緩慢,您將收到響應超時和/或連接超時。這些值遵循套接字類的超時值。

當超過這些超時時,您將獲得超時豁免或連接異常,您可以將計數器代碼記錄下您獲得的數量。

+0

由於2周前我遇到了問題,我寫了自己的客戶端。儘管如此,我測試了你的方法,它正在工作!當時我確實找到了一段類似的代碼,但是當我嘗試轉換爲BindingProvider時,它不知何故給了我一個ClassCastException。 – f1sh 2010-06-29 12:32:03

+0

我有一個類似的問題,但超時發生在我得到端口時,我該如何解決? – maugch 2016-08-04 19:23:43