在使用WebService时,出现了超时的异常,如下。
警告: Interceptor for {http://www.idc.com/idc/idc.wsdl}SouthBaseService#{http://www.idc.com/idc/idc.wsdl}SyncVmInfo has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
...
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://127.0.0.1:8081/njrs/SouthBaseWS: Read timed out
...
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:689)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2165)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2134)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1988)
... 105 more
最初的想法是觉得肯定有地方是可以设置这么一个超时时间的,但是却苦苦找不到设置的地方,最终经过各种折腾,Google之百度之,找到了解决办法。
Using WebService, we usually set in the client request timeout limit in order to avoid long time to connect to the server is unavailable. CXF environment, the client can be configured through two properties timeout limit:
在使用网络服务时,通常需要为客户端设置请求超时时间,以避免长时间的去连接不可用的服务器。在CXF环境中,客户端可以通过两个参数配置超时限制:
The ConnectionTimeout: WebService based TCP connection, this property can be understood as TCP handshake time settings, exceeds the time that it is the connection timeout in milliseconds, the default is 30000 milliseconds, or 30 seconds.
ConnectionTimeout: WebService是基于TCP连接的,因此这个属性可以理解为设置TCP握手时间,若超出这个时间就认为连接超时。默认的时间单位是毫秒,默认设置是30000毫秒,即30秒。
ReceiveTimeout: this property WebService request is sent to wait for a response time exceeds the length of time that it is the response timeout in milliseconds, the default is 60000 milliseconds, or 60 seconds.
ReceiveTimeout: 这个属性表示发送WebService请求后所等待响应的时间,若超过设置的时间则认为超时。默认的时间单位是毫秒,默认设置是60000毫秒,即60秒。
Here are two ways to configure the client:
下面有两种方法可以在客户端进行配置:
In the spring configuration file settings.
- 在
spring
配置文件中进行配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd ">
<http-conf:conduit name="{WSDL Namespace}portName.http-conduit">
<http-conf:client ConnectionTimeout="10000" ReceiveTimeout="20000"/>
</http-conf:conduit>
</beans>
It should be noted there are several places:
1, we need to specify the http-conf namespace: xmlns: http-conf =
2, the location of the specified pattern:
Http-conf: Conduit name attribute to specify service settings to take effect. by the service namespace in the WSDL port name. "http-conduit", the name attribute, such as the {} HelloWorld.http in-conduit. If the name attribute is set to "http-conduit", will be effective for all services.
如下几点需要注意:
- 需要指定
http-conf
的命名空间:xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
- 指定模式位置:
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
- http-conf:conduit中的name属性,指定设置生效的服务。name属性由service的namespace、WSDL中的 port name和".http-conduit"组成,如{http://apache.org/hello_world}HelloWorld.http- conduit。如果将name属性设置为“*.http-conduit”,则会对所有服务生效。
Java code to be set.
- 使用Java代码设置:
Client client = ClientProxy.getClient (port);
HTTPConduit http = (HTTPConduit) client.getConduit();
To = new HTTPClientPolicy (HTTPClientPolicy httpClientPolicy);
httpClientPolicy.setConnectionTimeout (36000);
httpClientPolicy.setAllowChunking (false);
httpClientPolicy.setReceiveTimeout (32000);
http.setClient (httpClientPolicy);
Server-side set spring code is as follows:
- 服务器端的spring代码配置如下:
<! - On the server side to set the response timeout limit, now is the default value of 30 seconds ->
<http-conf:destination name="*.http-conduit">
<http-conf:server ReceiveTimeout="30000" />
</ Http-conf: destination>
如果觉得有用,欢迎关注我的微信,有问题可以直接交流: