我們有個和第三方系統以Web Service同步的作業,使用傳統的SOAP溝通,不知為何在送出request後總會停頓十多秒才會接到回應,這個問題困擾許久,一直無法找到解決方法。
IE 11除錯追蹤
我們以IE 11的F12除錯偵測的狀況如下:
- 在呼叫Web Service之前按〔F12〕→【網路】並啟動其追蹤功能。
- 送出request後會記錄網路傳輸狀況。
- 按【詳細資訊】可以查看要求與回應的詳細內容。
其實這些追蹤只是證實每次都會等待才會接到回應,延遲狀態依舊無法改善。最後只好修改程式,放棄標準的SOAP寫法改用更低階些的java.net.URL,改寫步驟是:
1. 下載並安裝SoapUI
SoapUI是一套開源的Web Service測試應用程式,透過SoapUI我們就能擷取到傳輸過程中的內容,再用java.net.URL來傳送這些內容。
2. 執行SoapUI
首先建立新的request並指定Web Service的WSDL網址,再將request的XML內容存入剪貼簿,這個內容就是我們要使用的request內容。
3. 撰寫Java程式
使用java.net.URL叫用Web Service的寫法示範如下:
URL baseURL = new URL(urlAddress); con = (HttpURLConnection) baseURL.openConnection(); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); // 發送請求参数;要換成由SoapUI取到的request內容 String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://第三方WebService網址/\">" + " <soapenv:Header/>" + " <soapenv:Body>" + " <ws:process>" + " <arg0>" + params + "</arg0>" + " </ws:process>" + " </soapenv:Body>" + "</soapenv:Envelope>"; System.out.println("soap:"+soap); con.setRequestMethod("POST"); con.setRequestProperty("Accept", "application/soap+xml"); con.setRequestProperty("Content-length", String.valueOf(soap.length())); con.setRequestProperty("Content-Type", "application/soap+xml;charset=UTF-8"); dataOutput = new DataOutputStream(con.getOutputStream()); dataOutput.write(soap.getBytes("UTF-8")); dataOutput.flush(); dataOutput.close(); // 取出回應 dataOutput = null; int code = con.getResponseCode(); System.out.println("Code=" + code); System.out.println("resp msg=" + con.getResponseMessage() + "<hr>"); StringBuilder result = new StringBuilder(); InputStream is = con.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line; while ((line = reader.readLine()) != null) { result.append(line); } String _sResponse = result.toString().trim(); System.out.println("response:"+_sResponse);
測試後連線速度大幅提升,停頓狀況消失了。至於造成遲延的原因,推測是對方AP Server的版本比較舊的原因,也有同事提出或許是IPv6的問題,不過既然問題解決了就沒有再深入探討的興致了。
##
您可能也會有興趣的類似文章
- Java: 使用jCIFS存取遠端網路磁碟機的檔案 (0則留言, 2015/05/20)
- 以Scribe-java實作Google OAuth 2.0的認證機制 (0則留言, 2013/02/19)
- Servlet 3.0的檔案上傳寫法 (2則留言, 2012/06/19)
- 解決 iReport 升級後的問題 (1則留言, 2005/11/22)
- [轉貼CNet] 開原碼Java工具熱 昇陽能否突圍? (0則留言, 2005/06/30)
- Java十年有成 (0則留言, 2005/04/12)
- Java程式庫Markdown4J簡介 (0則留言, 2013/02/22)
- 取得iReport / JasperReports報表內特定元件的方法 [修訂] (5則留言, 2011/10/17)
- Java之父James Gosling由Oracle辭職了… (2則留言, 2010/04/10)
- [Java] 在jar檔裡搜尋特定類別的工具 (0則留言, 2007/09/03)
- jTDS JDBC Driver在2012年10月釋出了能在JDK 1.7運行的1.3.0版 (0則留言, 2013/01/16)
- [jEdit] 關鍵字(縮寫)擴展的強大插件:SuperAbbrevs (1則留言, 2007/10/29)
- [jEdit] 方便的主控台插件Console (0則留言, 2007/10/28)
- [Java] JBuilder reportedly migrating to Eclipse? (1則留言, 2005/04/23)
- [轉貼] BEA採硬體途徑提升Java速度 (0則留言, 2005/06/27)