【发布时间】:2019-12-08 13:44:05
【问题描述】:
我有一个相当老的 twitter 机器人,已经运行了几年没问题。它使用 twitter4j,在 JRE 1.6 上运行。两天前我突然开始收到 SocketExceptions:
Exception in thread "main" Connection reset
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=7e95ed42 or
http://www.google.co.jp/search?q=8a72206c
TwitterException{exceptionCode=[7e95ed42-8a72206c faf0771e-c3d1e8db], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.7}
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:185)
at twitter4j.HttpClientBase.request(HttpClientBase.java:57)
at twitter4j.HttpClientBase.get(HttpClientBase.java:75)
at twitter4j.TwitterImpl.get(TwitterImpl.java:2084)
at twitter4j.TwitterImpl.getFriendsList(TwitterImpl.java:808)
at twitter4j.TwitterImpl.getFriendsList(TwitterImpl.java:803)
at uk.co.twinance.Fetcher.getAvatars(Fetcher.java:167)
at uk.co.twinance.Fetcher.run(Fetcher.java:103)
at uk.co.twinance.Fetcher.main(Fetcher.java:203)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:422)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:460)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at twitter4j.HttpResponseImpl.<init>(HttpResponseImpl.java:35)
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:149)
... 8 more
我在我的 linode 和两台运行 Ubuntu 11 和 18 的家用笔记本电脑上得到了这个,我得到了每个请求的异常。
经过一番折腾,我发现如果我将运行时切换到 JRE 11,它可以完美运行!没有例外。
所以 - 我猜 Twitter 端的某些东西最近发生了变化(鉴于该问题在 3 台机器上可重现),但我不知道 JRE 如何以会导致问题的方式影响网络请求用推特。
有什么想法吗?
【问题讨论】:
-
JRE 6 将使用旧版本的 SSL/TLS 协议和/或旧的加密算法。通过在 JRE 中打开 SSL 调试,您可以更深入地了解正在发生的事情;例如docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/…。显然 Twitter 最近关闭了对 TLS 1.0 和 1.1 的支持 - thesslstore.com/blog/…
-
简单的解决方案是停止使用 Java 6。它在很久以前就被淘汰了。公开发布于 2013 年 4 月停止。那是六年前的事了。 “扩展支持”于 2018 年 12 月结束。
-
@StephenC - 有道理,谢谢。如果您作为答案,我会接受。是的,我需要更新。迄今为止的政策是,如果没有损坏,请不要修复它:)
标签: java runtime twitter4j socketexception