java - 尝试使用 Java 客户端库将大文本文件插入 Google 云端硬盘时出现超时异常

标签 java google-app-engine google-drive-api

我正在使用 Google Drive API 的 Java 客户端库上传一些文本文件并将其转换为 Google 文档格式。该代码在 Google App Engine 上运行。主要代码段如下所示:

    File fileMetadata = new File();
    fileMetadata.setTitle("Document title");
    fileMetadata.setDescription("Desc goes here");
    fileMetadata.setMimeType("text/plain; charset=utf-8");

    ByteArrayContent byteArrayContent = ByteArrayContent.fromString(
            "text/plain; charset=utf-8", "Text file's content goes here");

    Drive.Files.Insert insertRequest = driveService.files()
            .insert(fileMetadata, byteArrayContent).setConvert(true);

    File insertedFile = insertRequest.execute();

对于小文本文件,上面的代码可以正常工作。但是当文本文件很大时(也许还有一些我不知道的其他因素),它会抛出以下异常:

Uncaught exception from servlet
java.net.SocketTimeoutException: Timeout while fetching URL: https://www.googleapis.com/upload/drive/v2/files?convert=true&uploadType=resumable&upload_id=AEnB2UpPDz6jvM8zO2zPFxFHmoCiisplOf1Ui5fngZdI4qqoK6hwt_wtOt89RcW3QautW9FPlHKfMznYA4gmo95qdWthJQgWpQ
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:145)
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:45)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:419)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:298)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:151)
    at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
    at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequestWithoutGZip(MediaHttpUploader.java:545)
    at com.google.api.client.googleapis.media.MediaHttpUploader.resumableUpload(MediaHttpUploader.java:417)
    at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:336)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:418)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

有人说这是由于 URLConnection 超时造成的。但我使用的是 Java 客户端库,它不允许我显式设置超时。此外,上述异常在 insertRequest.execute() 调用后至少 30 秒发生。

我怀疑Java客户端库设置了30秒的内部超时...我希望一些Google软件工程师可以看看。

任何想法都会受到赞赏。非常感谢。

最佳答案

上传大文件时会出现此错误。尝试实现可断点续传。您可以在下页中阅读有关该方法以及示例的更多信息:https://developers.google.com/drive/web/manage-uploads#resumable

基于Java库,您应该在insertRequest.execute()之前添加以下代码

MediaHttpUploader uploader = insert.getMediaHttpUploader();
uploader.setDirectUploadEnabled(useDirectUpload);
uploader.setProgressListener(new FileUploadProgressListener());

关于java - 尝试使用 Java 客户端库将大文本文件插入 Google 云端硬盘时出现超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895963/

相关文章:

Java 8 API 静态方法在非空输入上运行函数,或返回 nullValue

google-app-engine - Google Cloud SDK 和 App Engine SDK 有什么区别

google-drive-api - 如果文件已共享到组并且组已删除,则无法检索权限

javascript - 使用 Google Drive SDK 共享文件

android - 播放服务 11.6 : OAuth consent screen not showing when published

java - 复合录制创建空视频

java - 无法使用 jinterop 打开 dcom session

python - 如何使用 webapp2 在 App Engine 中正确实现继承

java - 使用 SSL 时 Apache HttpClient 抛出 SocketTimeoutException

python - Google 应用程序引擎数据存储 : Dealing with eventual consistency