0

我们有一个相当精细的 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)
4

1 回答 1

2

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

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

Cron Jobs 的情况并非如此,它们在收到DeadlineExceededException.

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

  • 您将有 10 分钟的时间来完成您的工作
  • 万一 10 分钟还不够,您可能想要捕获DeadlineExceededException并重新创建另一个任务,并使用一个参数指示 Cron 作业从上次的位置起飞。

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

于 2012-11-27T10:25:33.087 回答