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


9

我这里有一个奇怪的问题。

在我重新启动客户端的tomcat服务器之前,以下代码可以正常工作。一旦我使用相同代码的最新war文件重启tomcat服务器(war文件中存在客户端程序),它将引发以下错误。我正在使用JDK 8。

下面是示例代码。从浏览器中,我可以从以下程序中使用的URL获得响应。但也无法使用Java程序或Postman获取数据。

package com.example.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class TestService implements CommandLineRunner{

    @Override
    public void run(String... args) throws Exception {
        download();
    }

    private void download() {
        System.out.println("Started download");
        try{
            RestTemplate restTemplate = new RestTemplate();
            String url = "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/niftyStockWatch.json";
            byte[] forObject = restTemplate.getForObject(url, byte [].class);
            System.out.println(forObject);
            System.out.println("Downloaded");
        }catch (Exception e) {
            System.out.println("Exception "+ e);
        }
    }

}

这是引发的异常:

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/niftyStockWatch.json": Connection reset; nested exception is java.net.SocketException: Connection reset
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:751)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:677)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:345)
    at com.sudhasoft.service.impl.StocksServiceImpl.getNiftyData(StocksServiceImpl.java:183)
    at com.sudhasoft.service.impl.StocksServiceImpl.getNifty500Data(StocksServiceImpl.java:154)
    at com.sudhasoft.service.impl.PatternServiceImpl.getDataBySignal(PatternServiceImpl.java:444)
    at com.sudhasoft.service.impl.PatternServiceImpl.loadDataOnInit(PatternServiceImpl.java:1090)
    at com.sudhasoft.service.CacheServiceImpl.initCache(CacheServiceImpl.java:29)
    at com.sudhasoft.scheduler.job.CacheJob.clearCache(CacheJob.java:41)
    at com.sudhasoft.scheduler.job.CacheJob.executeJob(CacheJob.java:25)
    at com.sudhasoft.scheduler.StockScheduler$1.run(StockScheduler.java:120)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at okio.Okio$2.read(Okio.java:139)
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:345)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:217)
    at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:212)
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
    at okhttp3.RealCall.execute(RealCall.java:77)
    at org.springframework.http.client.OkHttp3ClientHttpRequest.executeInternal(OkHttp3ClientHttpRequest.java:73)
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:742)
    ... 10 common frames omitted

2
如果我们可以忽略仅在重新启动服务器(或客户端?)之后才出现此问题,则该重复项将是stackoverflow.com/questions/5507878/ssl-connection-reset或类似的stackoverflow.com/questions/37005352/…的副本,即客户端和服务器使用不兼容的SSL设置...
PetrBodnár19年

看起来您的实际代码与此处提供的示例代码不同。如果不研究实际的代码,就不可能找到根本原因。
DinushaNT

您是否尝试跳过SSL验证
Keaz

您能否发布您的POM.XML文件
Varun Jain

Answers:


0

这似乎是由于防火墙问题引起的

为了解决此问题,您将需要使用代理服务器。您可以使用以下两行代码添加代理服务器和端口:

System.setProperty("proxyHost", "proxyServer.proxy.com");
System.setProperty("proxyPort", "9801");

没用
Sudhakar

-1

最简单的答案是,当重新启动tomcat时,只需关闭套接字,然后尝试将更多数据发送到关闭的套接字。这就是为什么由于无法写入数据而导致IO异常的原因

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.