SocketException:连接重置 - 客户端 Jersey 2.0 Java 7

Posted

技术标签:

【中文标题】SocketException:连接重置 - 客户端 Jersey 2.0 Java 7【英文标题】:SocketException: Connection reset - Client Jersey 2.0 Java 7 【发布时间】:2018-07-09 14:15:23 【问题描述】:

我收到与此 link1 类似的错误。 当我通过 REST 发布(客户端到服务器)一个小 xml 时,一切正常。不幸的是,当我发布一些更大的 xml 文件时,连接持续时间超过 10/15 分钟,我收到了一个错误。 (我认为这是某种超时)

我更正了我在链接 1 中提到的 SSL 证书 - configureClient() 方法在我的情况下与链接 1 中的解决方案相同。

我还添加了 System.setProperty("java.net.preferIPv4Stack" , "true"); - 有时它可以解决连接重置问题

基本信息:

错误:javax.ws.rs.ProcessingException:java.net.SocketException:连接重置

方法:REST POST

Java 版本:7

引擎:Jersey 2.x

方:客户端

系统:Windows 7

我的客户:

   System.setProperty("java.net.preferIPv4Stack" , "true");

RestMethodes restMethodes = new RestMethodes();
ClientConfig config = new ClientConfig();
config = config.property(ClientProperties.CONNECT_TIMEOUT, 0);
config = config.property(ClientProperties.READ_TIMEOUT, 0);

config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);

Client client = configureClient(config);
client.register(HttpAuthenticationFeature.basic(USER, PASS));

WebTarget target = client.target(SERVER_URL + "/bundles/assets");
Invocation.Builder responseInvocation = target.request(MediaType.APPLICATION_JSON);

// My exception is thrown there

Response response = responseInvocation.post(Entity.xml(assetsString)); 

String entity = response.readEntity(String.class);
//entity = jsonPrettyPrinter(entity);

if (entity.isEmpty() || entity.equals("")) 
    log.info("[POST ASSETS] Failed : Response is empty");

Response.StatusType codeName = response.getStatusInfo();
int code = response.getStatus();

if (code != 200) 
    log.error("[POST ASSETS] Failed : HTTP error code : " + response.getStatus() + "\n" + entity);
    response.close();
 else 
    log.info("[POST ASSETS] RESPONSE CODE ID : " + code + " CODE NAME : " + codeName);
    log.info("[POST ASSETS] RESPONSE : " + entity);
    response.close();

client.close();

我的错误

Exception in thread "main" javax.ws.rs.ProcessingException: java.net.SocketException: Connection reset
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:287)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:252)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437)
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343)
at com.sas.spl.saslineagebridges.test.PostTester.main(PostTester.java:61)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
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:704)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:675)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:399)
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285)
... 11 more

编辑:

我忘了提到我设法通过 CURL 从 bash 以无限超时发布我的请求并保持活动状态,所以这不应该是服务器问题。 CURL REST 帖子耗时 24 分钟。我的 java 客户端在 15 分钟后抛出连接重置。在我看来这可能是我的错。

【问题讨论】:

另见***.com/questions/585599/… 【参考方案1】:

您面临超时问题,尽管您的客户端似乎配置良好。此超时可能由任何防火墙、代理、负载平衡器甚至服务器本身(如果它在应用程序服务器前面运行像 Apache 之类的 Web 服务器)引起。请检查您的客户端和应用程序服务器之间的内容,并在各处相应地设置超时。

这并不意味着您不能在客户端本身上什么都不做,但在那里解决起来要困难得多。 在 Windows 上,您首先需要启用 TCP keep-alives。 之后,根据您使用的Client Transport,我们将尝试将 TCP keep-alives 添加到底层工厂构建的套接字中,我们知道在Axis clients 上可能会发生类似的事情。此解决方案对您来说更耗时。

【讨论】:

请准确说明连接或读取超时如何导致连接重置,以及 TCP keepalive 可以做些什么来修复它。 连接重置由客户端和应用服务器之间发生超时的元素发送。关闭连接可以是 FIN 或 RST 数据包。客户端发送的 TCP keepalive 允许防火墙等中介不陷入超时。你已经知道这一点,它在你的书中。这里有一个keepalive效果的演示,相信我它正在工作:blog.river-tiger.com/proxy-timeouts-tcp-keepalives 我启用了 SSL 跟踪并收到以下消息:main,处理异常:java.net.SocketException:连接重置 %% 无效:[Session-2, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256] main, SEND TLSv1.2 ALERT: fatal , description = unexpected_message main, WRITE: TLSv1.2 Alert, length = 26 main, 异常发送警报: java.net.SocketException: Connection reset by peer: socket write error main, call closeSocket() main, call close() main,调用 closeInternal(true) ######### 并在 header 中添加 keep-alive:.header("Connection", "keep-alive").post(Entity.xml(assetsString)); 互联网告诉我强制使用 TLSv1,但我遇到了类似的异常:#############%% 无效:[Session-2, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA] main, SEND TLSv1 ALERT :致命,描述 = 意外消息主要,写入:TLSv1 警报,长度 = 32########## link 添加 HTTP keep-alive 没有任何帮助,不幸的是,这个新跟踪没有提供任何新元素。我说的是 TCP keep-alive。您会看到我的回答被否决了,这令人沮丧。如前所述,检查客户端和服务器之间的所有内容,在必要时调整超时(例如,如果您有一个带有 ProxyPass 的 Apache:添加一个大值的超时键)

以上是关于SocketException:连接重置 - 客户端 Jersey 2.0 Java 7的主要内容,如果未能解决你的问题,请参考以下文章

java.net.SocketException:spring Rest模板中的连接重置

java.net.SocketException:软件导致连接中止:recv 失败,出现 java.net.SocketException:连接重置 [重复]

是啥导致我的 java.net.SocketException:连接重置? [复制]

在Android中获取“SocketException:对等方重置连接”

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

Apache HTTPClient 抛出 java.net.SocketException:许多域的连接重置