2016-05-22 16 views
1

Ich weiß, das wurde schon gefragt, und ich habe versucht, zu betrachten, mindestens 30 Lösungen auf Stackoverflow wenn nicht mehr, aber nichts hat bisher funktioniert.java.net.SocketException: Verbindung zurückgesetzt auf Tomcat Only

Ich habe einen Tomcat-Server, der in eine REST-API fragt, um Daten abzurufen und zu speichern. Dadurch wird vermieden, dass die Daten jedes Mal, wenn die App die Daten laden möchte, für die Remote-API abgefragt werden müssen. Die Daten ändern sich nur von Zeit zu Zeit und daher dieser Aufwand. Ich habe einen einfachen Code

final URL url = new URL("https://remote.site.com/api/request?apikey=<some-key>"); 
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 
connection.setConnectTimeout(5000); 
connection.setReadTimeout(5000); 
connection.connect(); 
final InputStream inputStream = connection.getInputStream(); 
final InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
final Gson gson = new Gson(); 
MyJSONResponse myJSONResponse = gson.fromJson(inputStreamReader, MyJSONResponse.class); 

zu verbinden Wenn ich diesen Code aus einem tomcat7-Server auf meinem MacBook laufen läuft es völlig in Ordnung. Ich bekomme JSON und alles ist gut. Also ging ich weiter und ließ das vom Tomcat7-Server auf meinem Ubuntu laufen und ich bekam fast sofort die SocketException.

Ich werde zugeben, dass die Daten ein wenig lang sind, aber ich würde erwarten, dass es einige Sekunden warten wird, bevor diese Ausnahme ausgelöst wird. Aber diese Ausnahme wird auf die Linie

geworfen, die für mich keinen Sinn ergibt. Um weiter zu testen, habe ich ein einziges Klassenprogramm erstellt, das nur diese Codezeilen enthält und den Eingabestrom aus der Remote-API ausgibt und auf meiner Ubuntu-Box ausgeführt hat. Es ist also nichts falsch mit der Ubuntu-Box und der Internetverbindung. Der Tomcat Server scheint hier etwas zu vermasseln. Ich habe versucht, mehrere Dinge für 4-5 Stunden jetzt mit dem Zurücksetzen der Verbindung zu tun, nicht schließen es in der endgültigen Block und andere Dinge, aber nichts scheint zu funktionieren. Jede Hilfe würde wirklich geschätzt werden. Dank

Edit: Hinzufügen von Protokollen für Timeout:

*** Init called 
May 22, 2016 11:23:21 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {s}->https://www.data.gov.in:443: Connection reset 
May 22, 2016 11:23:21 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {s}->https://www.data.gov.in:443 
May 22, 2016 11:23:22 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {s}->https://www.data.gov.in:443: Connection reset 
May 22, 2016 11:23:22 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {s}->https://www.data.gov.in:443 
May 22, 2016 11:23:24 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {s}->https://www.data.gov.in:443: Connection reset 
May 22, 2016 11:23:24 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {s}->https://www.data.gov.in:443 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:196) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) 
    at sun.security.ssl.InputRecord.read(InputRecord.java:480) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1344) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355) 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394) 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353) 
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134) 
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) 
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) 
    at com.soulpatch.jersey.DataFetcher.init(DataFetcher.java:47) 
    at com.soulpatch.jersey.DataFetcher.getBloodBanks(DataFetcher.java:86) 
    at com.soulpatch.jersey.resources.BloodBanksResource.getBloodBanks(BloodBanksResource.java:28) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    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:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Nein, es wird von 'connection.connect()' ausgelöst. – EJP

Antwort

0

Es scheint, die Website, die ich schlug der Täter war. Mein Server scheint ordnungsgemäß zu funktionieren, wenn ich https://www.google.com drücke. Also ich glaube, es hat mit der SSL-Zertifikat-Auflösung auf meinem Tomcat zu tun.

+0

Nein, es hat damit zu tun, dass der Zielserver beim SSL-Handshake langsam ist. Nichts mit deinem Tomcat zu tun. Ich bezweifle, dass ein Zertifikat überhaupt noch erhalten wurde. Ihre Timeouts sind ziemlich aggressiv. Ich würde sie zumindest verdoppeln. – EJP

+0

Danke! Lass mich versuchen, ob das funktioniert. – LeoNeo

+0

Ich ging voran und verwendete den folgenden Code, um die Timeouts auf 30s zu erhöhen. (Ich wechselte zum Apache HttpClient): 'final HttpClient client = HttpClients.createDefault(); final RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout (30000) .setConnectTimeout (30000) .build(); 'es gibt mir immer noch den gleichen Fehler. Ich habe die Frage mit dem ganzen StackTrace aktualisiert. Wenn Sie sehen, ist die Zeit für einen erneuten Versuch sehr kurz. Fühlt sich wie es kaum wartet auf die Verbindung zu reagieren. Funktioniert perfekt in einem Browser. – LeoNeo