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

iru*_*umi 15 java apache timeout cxf

可能的原因是:

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个请求.超时发生在第三个soap请求中.

Car*_*eon 17

我的webservice客户端也遇到了这个错误.对我有用的解决方案是在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
       ...">
Run Code Online (Sandbox Code Playgroud)

2.添加http-conduit标签/元素并将RecieveTimeout/ConnectionTimeout设置为180000ms:

<http-conf:conduit name="*.http-conduit">
      <http-conf:client 
                      ConnectionTimeout="300000"
                      ReceiveTimeout="300000"/>       
</http-conf:conduit>
Run Code Online (Sandbox Code Playgroud)


Pau*_*nis 13

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

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

如果您使用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); 
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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>
Run Code Online (Sandbox Code Playgroud)

然后将该映射设置为您的<jaxws:client.../>配置.

  • 这些属性分别将名称更改为"javax.xml.ws.client.connectionTimeout"和"javax.xml.ws.client.receiveTimeout". (2认同)

Bob*_*ers 5

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

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);
}
Run Code Online (Sandbox Code Playgroud)