java SocketException: сброс соединения

#java #spring #rest #sockets #network-programming

#java #весна #отдых #сокеты #сетевое программирование

Вопрос:

Я получаю следующее исключение при запросе данных из стороннего API. Проблема возникает редко, но все же является критической потерей. Любые предложения о том, как это предотвратить, будут полезны.

Вот трассировка стека.

 transaction-load: <11>147500407977748914 transaction-load com.mycompany.nmi.client.NmiApiRestTemplateImpl[]: getTransactions() failed: http request failed: Connection reset
com.mycompany.nmi.client.rest.RestException: http request failed: Connection reset

Caused by: java.net.SocketException: Connection reset
    java.net.SocketInputStream.read(SocketInputStream.java:196)
    java.net.SocketInputStream.read(SocketInputStream.java:122)
    sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
    sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
    sun.security.ssl.InputRecord.read(InputRecord.java:509)
    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:944)
    sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342)
    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1369)
    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1353)
    sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
    sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
    org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76)
    org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:46)
    org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:49)
    com.mycompany.nmi.client.rest.RestClientServiceSpringImpl.getRequest(RestClientServiceSpringImpl.java:96)    
    com.mycompany.nmi.client.rest.RestClientServiceSpringImpl.getRequest(RestClientServiceSpringImpl.java:156)
    com.mycompany.nmi.client.NmiApiRestTemplateImpl.getTransactionsList(NmiApiRestTemplateImpl.java:158)
    com.mycompany.nmi.client.request.GetTransactionsListRequest.execute(GetTransactionsListRequest.java:172)
    com.mycompany.transactionload.stl.reader.SystemTransactionLoadReader.loadTransactions(SystemTransactionLoadReader.java:528)
    com.mycompany.transactionload.stl.reader.SystemTransactionLoadReader.init(SystemTransactionLoadReader.java:263)
    com.mycompany.transactionload.stl.reader.SystemTransactionLoadReader.read(SystemTransactionLoadReader.java:468)
    com.mycompany.transactionload.stl.reader.SystemTransactionLoadReader.read(SystemTransactionLoadReader.java:61)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:132)
    org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:120)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    com.sun.proxy.$Proxy16.read(Unknown Source)
    org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
    org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155)
    org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
    org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:108)
    org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
    org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
    org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
    org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
    org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
    org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:139)
    org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:136)
    java.util.concurrent.FutureTask.run(FutureTask.java:262)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    java.lang.Thread.run(Thread.java:745)
  

Комментарии:

1. Можете ли вы опубликовать полную трассировку стека?

2. опубликовал полную трассировку.

3. существуют даже рамки для решения такого рода случайных ошибок: github.com/spring-projects/spring-retry (batch.repeat звучит очень похоже, хотя) — для более длительных отключений вам, возможно, придется сохранить неудачный вызов службы в своего рода базе данных.

Ответ №1:

Это произойдет, когда одна сторона соединения решит (или будет вынуждена) резко прервать соединение. Это может быть вызвано вещами, которые полностью находятся вне вашего контроля, например, сбоем сервера.

Вы не можете предотвратить это в 100% случаев, поэтому вам нужно создать логику, чтобы справиться с этим, когда это произойдет (например, переподключиться и повторно отправить).