2011-09-07 17 views
5

Google 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秒に制限されているため、この1回の呼び出し以上の処理を行う必要があります。何してるの? –

+0

はい、私は6つのカテゴリからページの内容を取得し、NMJavaのランク付け場所を確認していましたので、NMJavaという名前を見つけるために各ページを通過するまでに時間がかかっていました。 – Frank

+1

非同期URLFetchの使用を検討しましたか?これにより、すべてのリクエストを並行して処理できます。 –

答えて

3
DeadlineExceededExceptionは、Webアプリケーションへのリクエストを処理するコードが処理に30秒以上かかるとスローされます。おそらく、あなたのコードは、他のサイトからデータを受け取るのを待たなければならない時間があるため、処理に時間がかかります。

task queueでタスクを作成し、そのデータをフェッチして処理し、Web要求/応答フローをタスクの進捗状況に応じて変更することができます。

+1

例外URLFetchの期限ではなく、要求の締め切り日である。 –

+0

@ニック良い点私は私の答えを修正します。 –

+0

Google App Engineサイトでこれを行うためのサンプルコードは複雑です非常に役に立ちます。 – Frank

2

コードがリクエストハンドラ内で実行されている場合、デフォルトでは、App-Engineによって強制される60秒の締め切りがあります。それを変更することはできません。 「スケーリングタイプ」の下で、このページのチャートの「期限」行/「自動スケーリング」欄を参照してください:あなたは、あなたのモジュールを変更した場合

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

しかし、このコードは、いくつかの時間のために実行することができるようになります"手動スケーリング"と "B1" - "B4"インスタンスを使用することができます。例:

デフォルト/ srcに/メイン/ webappの/ WEB-INF/web.xmlのAppEngineの-:インスタンスのこのタイプに

<?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> 

は、あなたの要求は、通常、時間のタイムアウトしません。 (文書では、期限が「不確定」であると主張しています)。

関連する問題