gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:00:23 25 4
gpt4 key购买 nike

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

下面是一个简短的堆栈跟踪,显示进程在写入基于 CXF 的 JAX-WS 接口(interface)时被阻止:

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)来做到这一点?

最佳答案

您可以设置超时,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 秒,所以它应该被中止。

关于java - 如何检测和处理CXF中的写入超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com