App Engine Java blob删除超过了截止日期

时间:2012-11-27 09:18:58

标签: 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)

1 个答案:

答案 0 :(得分:2)

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

所有HTTP请求都限制为60秒完成工作并返回。如果没有,App Engine会抛出此异常。简而言之,当调用应用程序来提供Web请求时,它必须在60秒内发出响应。

Cron Jobs的情况并非如此,他们在收到DeadlineExceededException之前的时间限制为10分钟。

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

  • 您将有10分钟完成工作
  • 如果甚至10分钟还不够,你可能想抓住DeadlineExceededException,然后用一个参数重新创建另一个任务,该参数将指示Cron Job从最后的位置起飞。

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