2016-05-22 4 views
1

Я знаю, что это было задано раньше, и я попытался рассмотреть, по крайней мере, 30 решений по stackoverflow, если не больше, но до сих пор ничего не работало.java.net.SocketException: Сброс соединения только на Tomcat

У меня есть сервер tomcat, который запрашивает api apache для получения и хранения данных. Это делается для того, чтобы избежать необходимости запрашивать данные в удаленном API каждый раз, когда мое приложение хочет загрузить данные. Данные изменяются только раз в то время и, следовательно, это усилие. У меня есть простой код для подключения

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); 

Когда я запускаю этот код с сервера Tomcat7 на моем MacBook он работает прекрасно. Я получаю JSON, и все это hunky dory. Поэтому я пошел вперед и запустил это изнутри сервера Tomcat7 на моем Ubuntu, и я почти сразу получил SocketException.

Я уступлю, что данные немного длинны, но я ожидаю, что он подождет несколько секунд, прежде чем выбросить это исключение. Но это исключение выбрасывается на линии

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 

, что для меня не имеет смысла. Чтобы проверить далее, я сделал одну программу класса, содержащую только эти строки кода, и распечатываю входной поток, который я получаю из удаленного api, и запускал его в своем поле Ubuntu, и он работает отлично. Таким образом, нет ничего плохого в коробке Ubuntu, и это интернет-соединение. Кажется, что Tomcat Server что-то испортил. Я пытаюсь сделать несколько вещей в течение 4-5 часов с сбросом соединения, а не закрытием его в блоке finally и другими вещами, но ничего не работает. Любая помощь будет действительно оценена. Благодаря

Edit: Добавление журналы для тайм-аута:

*** 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

Нет, он вызывается 'connection.connect()'. – EJP

ответ

0

Кажется, сайт, что я бил был виновником. Мой сервер работает нормально, когда я ударил https://www.google.com. Так что я считаю, что это связано с разрешением SSL-сертификата на моем Tomcat.

+0

Нет, это связано с медленным ходом целевого сервера в SSL-квитировании. Ничего общего с твоим Tomcat. Я сомневаюсь, что сертификат еще был получен. Ваши тайм-ауты довольно агрессивны. Я бы удвоил их. – EJP

+0

Спасибо! Позвольте мне попытаться посмотреть, работает ли это. – LeoNeo

+0

Я пошел дальше и использовал следующий код, чтобы увеличить тайм-ауты до 30 секунд. (Я перешел на apache HttpClient): «конечный клиент HttpClient = HttpClients.createDefault(); final RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout (30000) .setConnectTimeout (30000) .build(); 'он по-прежнему дает мне ту же ошибку. Я обновил вопрос с помощью всего stacktrace. Если вы видите, время для повторения очень короткое. Чувства, подобные ему, едва ждут ответа на соединение. Прекрасно работает в браузере. – LeoNeo