Jave Web MGO开发

CXF WebService 客户端设置超时时间

2015-12-31  本文已影响4597人  hoxis

在使用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环境中,客户端可以通过两个参数配置超时限制:

Here are two ways to configure the client:
下面有两种方法可以在客户端进行配置:

In the spring configuration file settings.

<?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.

如下几点需要注意:

  1. 需要指定http-conf的命名空间:xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
  2. 指定模式位置: http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
  3. 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.

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:

<! - 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>

如果觉得有用,欢迎关注我的微信,有问题可以直接交流:

你的关注是对我最大的鼓励!你的关注是对我最大的鼓励!

参考:
http://www.javawebdevelop.com/3314355/

上一篇 下一篇

猜你喜欢

热点阅读