java - App Engine Java blob 删除已超过截止日期

标签 java google-app-engine blobstore

我们有一个相当复杂的 App Engine Java 应用程序,它与 blob 存储大量配合使用。由于某种原因,一个用户(这适用于其他用户)的上传代码出现超时错误(这会删除一些旧的 blob)。它不会删除很多 blob(不超过 10 个),所以我不确定发生了什么,但他能够多次一致地重现此问题,直到问题突然自行解决......

我担心的是,它将来会开始出现在其他用户面前,我宁愿不清理这些 Blob ,也不愿失败。

我将来可能会改变我们的架构,只使用后台 cron 作业来查找没有被任何人引用的 blob 并删除它们,但如果有人能够阐明这个问题,我会很高兴。

Uncaught exception from servlet
com.google.apphosting.api.DeadlineExceededException: This request (7e6f710cb810ed92) started at 2012/11/27 08:59:54.585 UTC and was still executing at 2012/11/27 09:00:54.028 UTC.
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326)
    at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:275)
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:96)
    at com.google.appengine.tools.development.TimedFuture.get(TimedFuture.java:55)
    at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:69)
    at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:212)
    at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:66)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:183)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:180)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:180)
    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:66)
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:107)
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:56)
    at com.google.appengine.api.blobstore.BlobstoreServiceImpl.delete(BlobstoreServiceImpl.java:125)

最佳答案

您面临的异常是DeadlineExceededException。您似乎已通过 HTTP 请求或可能在 Google App Engine 上托管的 Web 应用程序内部调用了代码。

所有 HTTP 请求完成工作并返回的时间都限制在 60 秒内。如果不是,App Engine 将引发此异常。简而言之,当调用应用程序来处理 Web 请求时,它必须在 60 秒内发出响应。

Cron 作业的情况并非如此,它们在收到 DeadlineExceededException 之前也有 10 分钟的时间限制。

因此,您面临的行为是正常的,并且由 App Engine 控制。我建议您通过将此工作移至 Cron Jobs 来解决此问题,因为:

  • 您将有 10 分钟时间完成作业
  • 如果 10 分钟还不够,您可能需要捕获 DeadlineExceededException,然后使用参数重新创建另一个任务,该参数将指示 Cron 作业从上次的位置开始。

如果以上都不符合您的条件,请尝试探索 Backends在 AppEngine 中没有任何限制。

关于java - App Engine Java blob 删除已超过截止日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580872/

相关文章:

python - 在 UploadHandler 中执行图像转换并将其保存到 Blobstore

java - 如何在 Google App Engine 上基于 java 的 maven 项目中利用浏览器缓存?

java - XML 模式验证时超时和挂起线程

使用某些输入法时Java Frame无法关闭

google-app-engine - App Engine 数据存储区中的 key_id 和 key_name 有什么区别?

android - 为 App Engine 连接的 Android 项目从 Blob 存储迁移到 Google Cloud Storage

java - 转换来自 Blobstore 的图像

google-app-engine - 我无法在 blobstore 中上传 2 次相同的图像

java - 如何从 List<T> 中获取 Class<T>

java - jersey ws 2.0 @suspended AsyncResponse,它有什么作用?