2011-09-07 20 views
5

W Google App App Engine użyłem następujące wiersze czytać stronę z witryny:Limit czasu aplikacji 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(); 

Ale mam następujący błąd:

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) 

Wygląda to trwało dłużej niż chciałaby czekać, co mogę zrobić, jeśli strona jest wolna?

+0

Jest to limit czasu żądania, który następuje po 30 sekundach. Ponieważ żądania URLFetch są ograniczone do 10 sekund, musisz robić więcej niż tylko jedno połączenie. Co robisz? –

+0

Tak, otrzymywałem zawartość strony z 6 kategorii i widziałem, gdzie mój NMJava jest w rankingu, więc trwało to dłużej, ponieważ przechodzi przez każdą stronę, aby znaleźć nazwę NMJava i oblicza, gdzie stoi ponad wszystko. – Frank

+1

Czy rozważałeś użycie asynchronicznego narzędzia URLFetch? To pozwoli ci wykonywać wszystkie żądania równolegle. –

Odpowiedz

3

A DeadlineExceededException jest generowany, gdy kod przetwarzający żądanie do aplikacji internetowej trwa dłużej niż 30 sekund. Możliwe, że przetwarzanie kodu zajmuje trochę czasu z powodu czasu oczekiwania na otrzymanie danych z innej witryny.

Możesz utworzyć zadanie na task queue, aby pobrać i przetworzyć te dane, a także zmienić przepływ żądania/odpowiedzi, aby odpowiedzieć postępem w zadaniu.

+1

Wyjątek napotkany jest termin składania wniosków, a nie termin URLFetch. –

+0

@ Dobra wskazówka Poprawię moją odpowiedź. –

+0

Woo, wydaje się skomplikowane, przykładowy kod do tego w witrynie Google App Engine? Byłoby bardzo pomocne. – Frank

2

Jeśli kod jest uruchomiony w module obsługi żądania, domyślnie obowiązuje 60-sekundowy okres ważności dla aplikacji. Nie możesz tego zmienić. Patrz „terminów” wiersz/„automatycznego skalowania” kolumny wykresu na tej stronie pod „skalowania typów”:

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

Jednak ten kod będzie mógł działać przez kilka godzin po zmianie modułu używać "skalowania ręcznego" i instancji "B1" - "B4". Przykład:

default/src/main/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> 

Na tego rodzaju przykład, wasze prośby nie będzie zazwyczaj czas dla godzin. (Dokumentacja twierdzi, że termin jest "nieokreślony".)