18

可能是什么原因:

org.apache.cxf.interceptor.Fault: Could not send Message.

Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking https://xxx.xxx.xxx.xxx:8443/services/test: Read timed out

它通常发生在我向ws. 我正在使用apache cxf. 我完全确定它ws已启动并正在运行,因为在超时发生之前,客户端将再发送 2 个请求。超时发生在第三个肥皂请求中。

4

4 回答 4

18

我的网络服务客户端也遇到了这个错误。对我有用的解决方案是在 CXF 配置文件 (cxf.xml) 中配置 http 客户端。

Apache CXF 文档中所述:

1.添加http-conduit命名空间和xsd:

<beans ...
       xmlns:http-conf="http://cxf.apache.org/transports/http/configuration
       ...
       xsi:schemaLocation="...
           http://cxf.apache.org/transports/http/configuration
           http://cxf.apache.org/schemas/configuration/http-conf.xsd
       ...">

2.添加 http-conduit 标记/元素并将 ReceiveTimeout/ConnectionTimeout 设置为 300000 毫秒:

<http-conf:conduit name="*.http-conduit">
      <http-conf:client 
                      ConnectionTimeout="300000"
                      ReceiveTimeout="300000"/>       
</http-conf:conduit>
于 2013-09-25T05:16:03.793 回答
15

该错误消息意味着您的 Web 服务客户端试图通过网络从远程 Web 服务接收数据,但在特定时间段内没有收到数据,因此 Web 服务客户端停止等待接收数据。

可能的原因之一可能是timeout属性太低。默认分别为 30000 和 60000 毫秒的 cxf 默认值。这些可以根据您创建客户端的方式进行更改。

如果您使用 java 代码创建客户端,您可以使用:

//1 minute for connection
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000); 

//3 minutes for request
((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000); 

如果您使用的是 Spring,则可以使用如下映射:

<util:map id="jaxwsProperties">
    <entry key="com.sun.xml.internal.ws.request.timeout">
        <value type="java.lang.Integer">120000</value>
    </entry>
    <entry key="com.sun.xml.internal.ws.connect.timeout">
        <value type="java.lang.Integer">60000</value>
    </entry>
</util:map>

然后将该地图设置到您的<jaxws:client.../>配置中。

于 2013-02-01T09:12:44.473 回答
3

配置超时的另一种方法(以编程方式):

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Object serviceClass = factory.create();
defineTimeouts(serviceClass);

static void defineTimeouts(Object serviceClass) {
    Client cxfClient = ClientProxy.getClient(serviceClass);
    HTTPConduit httpConduit = (HTTPConduit) cxfClient.getConduit();

    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setConnectionTimeout(DEFAULT_CLIENT_CONNECTION_TIMEOUT);
    httpClientPolicy.setReceiveTimeout(DEFAULT_CLIENT_RECEIVE_TIMEOUT);
    httpConduit.setClient(httpClientPolicy);
}
于 2017-05-02T13:22:37.643 回答
0

您可能希望从 Apache CXF src 更改 receiveTimeout 设置并替换服务器中现有的 cxf-rt-transports-http-version.jar。

简要说明:(从Wildfly 8.2/undertow read time out获得说明)

  1. 从apache下载CXF2.7.16 src
  2. 将 maven/bin 添加到 PATH
  3. 导出 MAVEN_OPTS=-Xmx512m 以修复 permgen 错误
  4. 打开 ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsd 并将 ReceiveTimeout 从 60000 更改为例如所需的任何值。600000(10 分钟)
  5. 运行 mvn -Pfastinstall
  6. 从 ./rt/transports/http/target 文件夹中获取“已修补”的 cxf-rt-transports-http-2.7.16.jar
  7. 替换服务器中的 cxf-rt-transports-http-2.7.16.jar。例如,对于 wildfly8.2,它位于 .//modules/system/layers/base/org/apache/cxf/impl/main 文件夹中,请记住更新同一文件夹中的 module.xml 以使用此修补的 cxf-rt -transsports-http-2.7.16.jar。

这应该解决由服务器中使用的底层 Apache CXF 引起的 SocketTimeoutException。

于 2015-06-25T02:25:54.740 回答