如何检测和处理CXF中的写入超时

时间:2016-12-07 21:53:46

标签: java sockets cxf

今天遇到一个奇怪的情况,我的基于Java的CXF客户端挂起写入远程套接字。

这是一个缩写的堆栈跟踪,显示该进程被阻止写入基于CXF的JAX-WS接口:

java.net.SocketOutputStream.socketWrite0
java.net.SocketOutputStream.socketWrite
...
org.apache.cxf.io.AbstractWrappedOutputStream.write
org.apache.cxf.io.AbstractThresholdOutputStream.write
...
org.apache.cxf.jaxws.JaxWsClientProxy.invoke
com.sun.proxy.$Proxy143.getAllBusLmp
name.willdarby.trading.pjmService.PjmUpdateChecker.load5MinBus

netstat显示以下内容,说明套接字已连接且写入缓冲区已满:

Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp      482 182000 ip-xxx.xxx-xxx-xxx.ip.:41368 xxx.xxx.com:https    ESTABLISHED

据我所知,操作系统认为套接字仍处于活动状态,这就是写入阻塞的原因。它处于这种状态至少45分钟。 我想在5分钟后检测到这些被阻止的写入并重置套接字。有没有办法用CXF(目前使用3.1.4版本)?

1 个答案:

答案 0 :(得分:1)

您可以暂停超时,CXF将中止连接。

Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(30000); // 30 seconds
httpClientPolicy.setReceiveTimeout(300000);  //5 minutes
http.setClient(httpClientPolicy);

完整的参数列表为here。 0表示没有超时。

我不确定它是否适合您,因为默认连接超时为30秒,接收超时为60秒,因此应该已中止。