java - Java HTTP 请求超时 2 分钟
问题描述
我正在尝试从 Java 向 REST 服务进行 HTTP 调用。一切都很好,直到通话时间超过 120 秒。如果请求时间少于 120 秒,我可以成功地向同一服务发出请求。我的代码如下:
URL url = new URL("https://service.myurl.com/my-endpoint");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json; utf-8");
con.setReadTimeout(0);
con.setConnectTimeout(0);
con.setDoOutput(true);
con.setDoInput(true);
System.out.println(con.getReadTimeout() + "RT");
System.out.println(con.getConnectTimeout() + "CT");
System.out.println(System.getProperty("sun.net.client.defaultReadTimeout") + "SUN RT");
System.out.println(System.getProperty("sun.net.client.defaultConnectTimeout") + "SUN CT");
// System.out.println("Connection expires... " + con.getExpiration());
System.out.println("Getting output stream...");
System.out.println(System.getProperty("my-json"));
try (OutputStream os = con.getOutputStream()) {
byte[] input = System.getProperty("my-json").getBytes("utf-8");
os.write(input, 0, input.length);
}
System.out.println("Getting response...");
StringBuilder response = null;
//
// THE REQUEST FAILS IN THE FOLLOWING LINE,
// WHEN TRYING TO RETRIEVE THE INPUT STREAM
// WITH THE RESPONSE FROM THE SERVER
//
try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))) {
response = new StringBuilder();
String responseLine = null;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println(response.toString());
}
我得到的例外如下:
javax.net.ssl|WARNING|01|main|2021-03-16 15:49:10.285 UTC|Logger.java:765|handling exception (
"throwable" : {
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:457)
at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68)
at sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1095)
at sun.security.ssl.SSLSocketImpl.access$200(SSLSocketImpl.java:72)
at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:815)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)
at com.myurl.test.App.main(App.java:44)}
)
javax.net.ssl|SEVERE|01|main|2021-03-16 15:49:10.286 UTC|Logger.java:765|Fatal (UNEXPECTED_MESSAGE): Connection reset (
"throwable" : {
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:457)
at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68)
at sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1095)
at sun.security.ssl.SSLSocketImpl.access$200(SSLSocketImpl.java:72)
at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:815)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)
at com.myurl.test.App.main(App.java:44)}
)
我尝试将连接和读取超时设置为 0、最大整数值以及以下 JVM 参数... -Dsun.net.client.defaultReadTimeout=600000 -Dsun.net.client.defaultConnectTimeout=600000
(10 分钟)。没有什么对我有用。
我很确定问题出在 Java 的执行上,因为在同一台服务器上,使用 CURL 我能够执行需要超过 2 分钟的相同请求。
对此的任何帮助表示赞赏。
谢谢你。
编辑 2021-03-16
该服务能够接收请求并对其进行处理。问题是当我们尝试从服务读取响应时。
解决方案
推荐阅读
- sql - 如何将 2 个表中的 2 列连接到一个列中?
- api - 是否有显示函数参数的 voip.ms API 文档
- java - Java java.lang.ClassNotFoundException:jade.core.migration.InterPlatformMobilityService
- python-3.x - AttributeError 是否正常工作 pandas df
- wordpress - 在 Wordpress 中将帖子状态设置为“私人”会生成真正的 404 页面吗?
- mysql - SLOW QUERY / IN HAVING 子句
- ios - 尝试通过 VTDecompressionSessionDecodeFrame 传递和读取 UnsafeMutableRawPointer 时的 EXC_BAD_ACCESS
- matlab - 你如何使用while循环计算算术级数的总和?
- powerbi - 如何计算 Power BI 中的周期时间?
- sql - Msg 116, Level 16, State 1, Line 2 当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式