CXF WebService 客户端设置超时时间

本文详细介绍了在CXF环境下,如何为WebService客户端设置连接和接收超时时间,包括TCP握手时间和等待响应时间的默认值及配置方法。通过修改Spring配置文件或使用Java代码,可以有效避免连接和服务响应超时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍CXF WebService 客户端如何设置超时时间,以及相关参数的介绍。

在使用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.

如下几点需要注意:
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.
- 使用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>

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


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值