2011-09-07 202 views
5

在谷歌App Engine应用程序我用下面的线从网站阅读页面:Google App Engine超时?

String Url="http://...",line,Result=""; 

    URL url=new URL(Url+"?r="+System.currentTimeMillis()); 
    BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream())); 

    while ((line=reader.readLine())!=null) { Result+=line+"\n"; } 
    reader.close(); 

但我得到了以下错误:

Uncaught exception from servlet 
com.google.apphosting.api.DeadlineExceededException: This request (f5e2889605d27d42) started at 2011/09/07 03:20:41.458 UTC and was still executing at 2011/09/07 03:21:30.888 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:276) 
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:82) 
    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:177) 
    at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:56) 
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:150) 
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:148) 
    at java.security.AccessController.doPrivileged(Native Method) 

看来,这需要较长的时间比它想等待,如果该网站很慢,我该怎么办?

+0

这是请求超时,发生在30秒后。由于URLFetch请求被限制为10秒,因此您必须做的不仅仅是这一次调用。你在做什么? –

+0

是的,我从6个类别中获取页面内容,并查看我的NMJava的排名,所以花费更长的时间,因为它通过每个页面查找名称NMJava并计算它的所有位置。 – Frank

+1

你有没有考虑过使用异步URLFetch?这可以让你同时处理所有的请求。 –

回答

3

当您的代码处理请求到您的Web应用程序需要30秒以上的处理时,会引发DeadlineExceededException。假设你的代码需要一段时间才能处理,因为它需要等待从其他站点接收数据的时间。

您可以在task queue上创建一个任务来获取并处理该数据,并将您的Web请求/响应流程更改为回复,并随任务进度进行回复。

+1

异常遇到的是请求截止日期,而不是URLFetch截止日期。 –

+0

@尼克好点我会修改我的答案。 –

+0

Woo,看起来很复杂,任何示例代码都可以在Google App Engine网站上执行此操作?这将是非常有益的。 – Frank

2

如果您的代码在请求处理程序中运行,那么默认情况下,应用程序引擎强制执行60秒的最后期限。你不能改变它。请参阅“缩放类型”中的“截止日期”行/“自动缩放”此页上的图列:

https://developers.google.com/appengine/docs/java/modules/

然而,这段代码将能够为几个小时运行,如果你改变你的模块使用“手动缩放”和“B1” - “B4”实例。例如:

默认/ src目录/主/ web应用/ WEB-INF/AppEngine上-web.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application>myapp</application> 
    <module>default</module> 
    <version>1</version> 
    <threadsafe>true</threadsafe> 

    <instance-class>B1</instance-class> 
    <manual-scaling> 
    <instances>1</instances> 
    </manual-scaling> 
</appengine-web-app> 

在这种情况下,你的要求通常不用于小时超时。 (文档声称截止日期为“无限期”。)