Set Timeout for JAXWS client

從網路上查到在用 JAXWS Client 呼叫 WS 的時候,如何設定 timeout。

假設初始宣告為

WSService service = new WSService();
WS port = service.getWSPort();
int conTimeout = 3000; // Timeout in millis
int reqTimeout = 3000; // Timeout in millis

基本的 timeout 設定方法是:

((BindingProvider)port).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, conTimeout);
((BindingProvider)port).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, reqTimeout);
// JAXWSProperties.CONNECT_TIMEOUT = "com.sun.xml.ws.connect.timeout"
// JAXWSProperties.REQUEST_TIMEOUT = "com.sun.xml.ws.request.timeout"

((BindingProvider)port).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", conTimeout);
((BindingProvider)port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", reqTimeout);

根據網頁 http://metro.1045641.n5.nabble.com/Web-Service-client-getting-intermittent-timeouts-td3231193.html

作者說用 "com.sun.xml.ws.connect.timeout" 是因為,HttpClientTransport 的版本為 Metor 裏的 webservices-rt.jar;
如果是用 "com.sun.xml.internal.ws.connect.timeout" ,則是 HttpClientTransport 的版本來自於系統所安裝的 JRE (jre/lib/rt.jar)。

在這個網頁 http://stackoverflow.com/questions/2148915/how-do-i-set-the-timeout-for-a-jax-ws-webservice-client
有更詳細的討論。討論串中有人說在 JDK 6 的環境下使用 JAXWS 的話,那就要用
"com.sun.xml.internal.ws.connect.timeout"
"com.sun.xml.internal.ws.request.timeout"

也可以直接利用 JAVA 的系統參數來設定:
System.setProperty("sun.net.client.defaultConnectTimeout", conTimeout);
System.setProperty("sun.net.client.defaultReadTimeout", reqTimeout);

可參考 Java SE 6 – Developer Guides 底下的 Java NetworkingNetworking Properties

廣告