在调用第三方提供的webservice接口时我们可以设置超时时间:
HTTPClientPolicy client = new HTTPClientPolicy();
client.setReceiveTimeout(1000 * 10); // 该时间为响应超时。
client.setConnectionTimeout(1000 * 20 ); // 连接超时。
超时后异常:
请求超时 .SocketTimeoutException: connect timed out
响应超时 .SocketTimeoutException: Read timed out
org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptorMessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)atorg.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:487)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)atorg.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)atorg.apache.cxf.frontend.ClientProxy.invoke(ClientProxy.java:68)atcom.sun.proxy.MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:487) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313) at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265) at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73) at org.apache.cxf.frontend.ClientProxy.invoke(ClientProxy.java:68) at com.sun.proxy.MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)atorg.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:487)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)atorg.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)atorg.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)atorg.apache.cxf.frontend.ClientProxy.invoke(ClientProxy.java:68)atcom.sun.proxy.Proxy32.bizECQuery(Unknown Source)
at com.sinosoft.test.Test.main(Test.java:400)
Caused by: .SocketTimeoutException: SocketTimeoutException invoking http://localhost:8080/services/IBizECQuery?wsdl: Read timed out
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.mapException(HTTPConduit.java:2058)atorg.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.mapException(HTTPConduit.java:2058) at org.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.mapException(HTTPConduit.java:2058)atorg.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.close(HTTPConduit.java:2043)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:639)
at org.apache.cxf.interceptor.MessageSenderInterceptorMessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)...8moreCausedby:.SocketTimeoutException:.SocketInputStream.socketRead0(NativeMethod).SocketInputStream.socketRead(SocketInputStream.java:116).SocketInputStream.read(SocketInputStream.java:171).SocketInputStream.read(SocketInputStream.java:141)atjava.io.BufferedInputStream.fill(BufferedInputStream.java:246)atjava.io.BufferedInputStream.read1(BufferedInputStream.java:286)atjava.io.BufferedInputStream.read(BufferedInputStream.java:345).www.http.HttpClient.parseHTTPHeader(HttpClient.java:704).www.http.HttpClient.parseHTTP(HttpClient.java:647).www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569).www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474).HttpURLConnection.getResponseCode(HttpURLConnection.java:480)atorg.apache.cxf.transport.http.HTTPConduitMessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ... 8 more Caused by: .SocketTimeoutException: Read timed out at .SocketInputStream.socketRead0(Native Method) at .SocketInputStream.socketRead(SocketInputStream.java:116) at .SocketInputStream.read(SocketInputStream.java:171) at .SocketInputStream.read(SocketInputStream.java:141) at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) at java.io.BufferedInputStream.read(BufferedInputStream.java:345) at .www.http.HttpClient.parseHTTPHeader(HttpClient.java:704) at .www.http.HttpClient.parseHTTP(HttpClient.java:647) at .www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569) at .www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) at .HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at org.apache.cxf.transport.http.HTTPConduitMessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)...8moreCausedby:.SocketTimeoutException:.SocketInputStream.socketRead0(NativeMethod).SocketInputStream.socketRead(SocketInputStream.java:116).SocketInputStream.read(SocketInputStream.java:171).SocketInputStream.read(SocketInputStream.java:141)atjava.io.BufferedInputStream.fill(BufferedInputStream.java:246)atjava.io.BufferedInputStream.read1(BufferedInputStream.java:286)atjava.io.BufferedInputStream.read(BufferedInputStream.java:345).www.http.HttpClient.parseHTTPHeader(HttpClient.java:704).www.http.HttpClient.parseHTTP(HttpClient.java:647).www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569).www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474).HttpURLConnection.getResponseCode(HttpURLConnection.java:480)atorg.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.handleResponseInternal(HTTPConduit.java:2165)
at org.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.handleResponse(HTTPConduit.java:2134)atorg.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.handleResponse(HTTPConduit.java:2134) at org.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.handleResponse(HTTPConduit.java:2134)atorg.apache.cxf.transport.http.HTTPConduitWrappedOutputStream.close(HTTPConduit.java:1988)
… 11 more
处理超时的时候我们想捕获.SocketTimeoutException异常是捕获不到的,但是有时又需要根据超时返回响应的结果。
经过认真思考终于发现了解决办法:
catch (Exception e) { e.printStackTrace(); Throwable cause = e.getCause(); if (cause.getMessage().indexOf(“Connection refused: connect”) > 0){ System.out.println(“连接异常”); }else if (cause.getMessage().indexOf(“Read timed out”) > 0){ System.out.println(“响应超时”); }else if (cause.getMessage().indexOf(“connect timed out”) > 0){ System.out.println(“连接超时”); }else{ System.out.println(“处理异常”); } }
连接异常:地址连接不可用,可能是服务端没有启动。