这是我的配置:
httpClient = new OkHttpClient.Builder()
.callTimeout(Duration.ofSeconds(60))
.connectTimeout(Duration.ofSeconds(60))
.readTimeout(Duration.ofSeconds(60))
.writeTimeout(Duration.ofSeconds(60))
.build();
Run Code Online (Sandbox Code Playgroud)
我有一个使用此客户端的多线程进程。运行几秒钟后,我得到:
java.net.SocketTimeoutException:
在okio.Okio $ 4.newTimeoutException(Okio.java:232)
在okio.AsyncTimeout.exit(AsyncTimeout.java:286)
在okio.AsyncTimeout $ 2.read(AsyncTimeout.java:241)
在.RealBufferedSource.indexOf(RealBufferedSource.java:358)
如果将超时配置为60秒怎么办?
编辑:
即使添加自定义调度程序也无济于事:
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(Integer.MAX_VALUE);
dispatcher.setMaxRequestsPerHost(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
技术细节:
与我所说的相反,我在Linux机器上同时运行客户端和服务器:
客户端计算机:net.ipv4.tcp_keepalive_time = 7200
服务器计算机:net.ipv4.tcp_keepalive_time = 7200
您很可能受到操作系统施加的套接字超时的影响。Java 无法扩展它们,因为套接字是由系统管理的。根据这个很好的答案,“更改 TCP 超时”部分:
不幸的是,由于 TCP 连接是在操作系统级别上管理的,因此 Java 不支持在每个套接字级别上配置超时,例如在
java.net.Socket. 我发现了一些使用 Java 本机接口 (JNI) 来创建调用本机代码来配置这些选项的 Java 套接字的尝试,但似乎没有一个得到广泛的社区采用或支持。
对于 MacOS,您必须查看sysctl net.inet.tcp输出并了解系统限制是什么。
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |