2011-09-07 157 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> 

在這種情況下,你的要求通常不用於小時超時。 (文檔聲稱截止日期爲「無限期」。)