Java 从Google存储下载数据时出现SocketTimeoutException

Java 从Google存储下载数据时出现SocketTimeoutException,java,google-api,google-cloud-storage,Java,Google Api,Google Cloud Storage,我在从Google存储下载数据时收到大量SocketTimeoutException。增加超时时间的最佳方法是什么 用例 使用Map/Reduce从多个服务器并行下载总共10GB的24个文件 源代码 堆栈跟踪 编辑 只有当我从日本下载数据时才会发生这种情况。从美国东部到美国西部,一切都很好。寻找一个名为CommandTimeout的变量,或类似性质的变量。通常,这决定了连接在标记错误之前可以持续多长时间 ConnectionTimeout通常意味着程序可以尝试连接到源代码的时间,这并不是您真正需

我在从Google存储下载数据时收到大量SocketTimeoutException。增加超时时间的最佳方法是什么

用例

使用Map/Reduce从多个服务器并行下载总共10GB的24个文件

源代码

堆栈跟踪

编辑


只有当我从日本下载数据时才会发生这种情况。从美国东部到美国西部,一切都很好。

寻找一个名为CommandTimeout的变量,或类似性质的变量。通常,这决定了连接在标记错误之前可以持续多长时间

ConnectionTimeout通常意味着程序可以尝试连接到源代码的时间,这并不是您真正需要更改的,因为连接速度快,下载速度慢。

请尝试以下操作

在linux框中设置代理。 在创建存储时,新的NetHttpTransport提供您自己的方法来创建套接字并在传输中添加代理

public HttpClient myHttpClient() throws Exception {
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    //SetRegisrty for both HTTP and HTTPS - Check google for this.
    schemeRegistry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), YOUR_PROXY_PORT));
    schemeRegistry.register(new Scheme("https", SSLSocketFactory
            .getSocketFactory(), 443));

    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 30 * 1000);  // SET the timeout
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    ClientConnectionManager connManager = new ThreadSafeClientConnManager(
            params, schemeRegistry);
    DefaultHttpClient httpClient = new DefaultHttpClient(connManager,
                params);
    try {
        int proxyPort = YOUR_PROXY_PORT;
        String proxyHost = "YOUR_PROXT_HOST_NAME";
        if (proxyPort > 0 && proxyHost != null && proxyHost.length() > 0) {
            System.setProperty("https.proxyHost", proxyHost);
            System.setProperty("https.proxyPort", proxyPort + "");
            System.setProperty("http.proxyHost", proxyHost);
            System.setProperty("http.proxyPort", proxyPort + "");
            HttpHost proxy = new HttpHost(proxyHost, proxyPort);
            httpClient.getParams().setParameter(
                    ConnRoutePNames.DEFAULT_PROXY, proxy);
        }
    } catch (NullPointerException e) {
        System.out.println("Proxy error here");
    }
    return httpClient;
}

public static HttpTransport myNetHttpTransport()
        throws Exception {
    return new ApacheHttpTransport(myHttpClient());
}
使用.setTransportmyNetHttpTransport代替NetHttpTransport


我们为此花了很长时间。但到目前为止,这似乎是可行的。请告诉我是否有任何帮助…

此变量的位置正是我要寻找的。你能说得更具体一点吗?我只是想尽快检查一下你是否关闭了连接。我不熟悉这个API,但大多数下载程序在使用结束时需要关闭连接。连接由API内部管理。我没有打开它,也没有手动关闭它。你今天还这样吗?刚才有一个暂时的问题影响了一些大文件的上传。你能再试一次,让我知道你是否仍然失败吗?它正在东京AWS进行。明天我将从加利福尼亚再试一次……有趣的是,美国东部的AWS没有超时。我想知道你们是否找到了解决方案?我使用AWS和俄勒冈州us-west-2地区,有时我确实会收到此超时。我第一次请求获取我的谷歌硬盘的目录列表时得到了它,即使是在传输大文件时也没有。不幸的是,没有找到比从美国地区而不是日本下载数据更好的解决方案,这对我的用例来说是完全好的。嗨,JordanD,谢谢,我是个新手,正在尽我最大的努力去了解这个过程。刚刚发布了答案。这个答案对我们有用。如果这对你有效,让我知道。如果您对此有任何疑问,请点击此处
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    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:927)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at sun.net.www.MeteredStream.read(MeteredStream.java:134)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3052)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3046)
    at com.google.api.client.util.ByteStreams.copy(ByteStreams.java:51)
    at com.google.api.client.util.IOUtils.copy(IOUtils.java:94)
    at com.google.api.client.util.IOUtils.copy(IOUtils.java:63)
    at com.google.api.client.googleapis.media.MediaHttpDownloader.executeCurrentRequest(MediaHttpDownloader.java:261)
    at com.google.api.client.googleapis.media.MediaHttpDownloader.download(MediaHttpDownloader.java:209)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeMediaAndDownloadTo(AbstractGoogleClientRequest.java:553)
    at com.google.api.services.storage.Storage$Objects$Get.executeMediaAndDownloadTo(Storage.java:4494)
public HttpClient myHttpClient() throws Exception {
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    //SetRegisrty for both HTTP and HTTPS - Check google for this.
    schemeRegistry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), YOUR_PROXY_PORT));
    schemeRegistry.register(new Scheme("https", SSLSocketFactory
            .getSocketFactory(), 443));

    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 30 * 1000);  // SET the timeout
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    ClientConnectionManager connManager = new ThreadSafeClientConnManager(
            params, schemeRegistry);
    DefaultHttpClient httpClient = new DefaultHttpClient(connManager,
                params);
    try {
        int proxyPort = YOUR_PROXY_PORT;
        String proxyHost = "YOUR_PROXT_HOST_NAME";
        if (proxyPort > 0 && proxyHost != null && proxyHost.length() > 0) {
            System.setProperty("https.proxyHost", proxyHost);
            System.setProperty("https.proxyPort", proxyPort + "");
            System.setProperty("http.proxyHost", proxyHost);
            System.setProperty("http.proxyPort", proxyPort + "");
            HttpHost proxy = new HttpHost(proxyHost, proxyPort);
            httpClient.getParams().setParameter(
                    ConnRoutePNames.DEFAULT_PROXY, proxy);
        }
    } catch (NullPointerException e) {
        System.out.println("Proxy error here");
    }
    return httpClient;
}

public static HttpTransport myNetHttpTransport()
        throws Exception {
    return new ApacheHttpTransport(myHttpClient());
}