apache cxf 无法发送消息和读取超时

2022-09-02 20:14:38

可能的原因是什么:

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

它通常发生在我向 .我正在使用 .我完全确定 是启动并运行的,因为在超时发生之前,客户端将再发送 2 个请求。超时发生在第三个 soap 请求中。wsapache cxfws


答案 1

我的Web服务客户端也遇到了此错误。对我有用的解决方案是在 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 ms:

<http-conf:conduit name="*.http-conduit">
      <http-conf:client 
                      ConnectionTimeout="300000"
                      ReceiveTimeout="300000"/>       
</http-conf:conduit>

答案 2

错误消息表示 Web 服务客户端尝试通过网络从远程 Web 服务接收数据,但在特定时间段内未收到任何数据,因此 Web 服务客户端停止等待接收数据。

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

如果您使用 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.../>


推荐