有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

okhttp获取java。网SocketException:当使用多线程的okhttpclient时,socket关闭

具体例外情况如下:

java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:230) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241) 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 com.a.service.settlement.conllection.synchronizer.DockerCSynchronizer.queryAndSaveSourceByURL(DockerCSynchronizer.java:127) at com.a.service.settlement.conllection.synchronizer.DockerCSynchronizer.access$000(DockerCSynchronizer.java:30) at com.a.service.settlement.conllection.synchronizer.DockerCSynchronizer$DockerSyncTask.run(DockerCSynchronizer.java:222) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.SocketException: Socket closed at java.net.SocketInputStream.read(SocketInputStream.java:203) at java.net.SocketInputStream.read(SocketInputStream.java:141) at okio.Okio$2.read(Okio.java:139) at okio.AsyncTimeout$2.read(AsyncTimeout.java:237) ... 27 more

这是我的代码:

 public class CollectionSource{
        private OkHttpClient httpClient = new OkHttpClient();
    public boolean collectSourceData() {
        ExecutorService ex = Executors.newFixedThreadPool(10);
        logger.info("docker source is starting!");
        for (int i =1; i<=10; i++) {
            String url = dockerSourceUrl + "2018-01-01"+ "?pageNum=" + i 
                +"&pageSize=100";
            DockerSyncTask dst = new DockerSyncTask(url);
            ex.submit(dst);
        }

        ex.shutdown();
        try {
            ex.awaitTermination(1L, TimeUnit.DAYS);
        } catch (InterruptedException e) {
            logger.error("awaitTermination error", e);
            return false;
        }

        logger.info("docker data source synchronized over!");
        return true;
    }
}

以下是任务,一个内部类:

class DockerSyncTask implements Runnable {
    private String url;
    DockerSyncTask(String url) {
        this.url = url;
    }
    public void run() {
        Request request = new 
        Request.Builder().url(url).get().build();
        try {
            Response resp = httpClient.newCall(request).execute();

            if (!resp.isSuccessful()) {
                logger.warn("QuerySourceDataTask error with message:
                {}", resp.message());
            }

            String response = resp.body().string();
            if (response != null && !response.equalsIgnoreCase("")) {
                logger.debug("{} return:{}", url, response);
                //保存到DB
                savePageData(response);

            } else {
                logger.warn("QuerySourceDataTask return null with url:
                {}!", url);
            }
        } catch (IOException e) {
            logger.error("QuerySourceDataTask error, url is [{}]", 
            url, e);
        }
    }
}

当ExecutorService未被使用(只有一个主线程)时,没有例外,有什么建议吗

JDK1。8.使用okhttp3


共 (0) 个答案