我们有一个相当精细的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)
答案 0 :(得分:2)
您面临的例外是DeadlineExceededException
。您似乎已经通过HTTP请求或在Google App Engine上托管的Web应用程序内部调用了您的代码。
所有HTTP请求都限制为60秒完成工作并返回。如果没有,App Engine会抛出此异常。简而言之,当调用应用程序来提供Web请求时,它必须在60秒内发出响应。
Cron Jobs的情况并非如此,他们在收到DeadlineExceededException
之前的时间限制为10分钟。
因此,您面临的行为是正常的,并由App Engine控制。我建议你通过将这项工作转移到Cron Jobs来解决这个问题,因为:
DeadlineExceededException
,然后用一个参数重新创建另一个任务,该参数将指示Cron Job从最后的位置起飞。如果以上都不符合您的条件,请尝试在AppEngine中探索没有限制的Backends。