2011-09-07 44 views
5

Trong một ứng dụng Google App Engine tôi đã sử dụng những dòng sau để đọc một trang từ một trang web:Google App Engine hết giờ?

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(); 

Nhưng tôi đã nhận lỗi sau:

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) 

Có vẻ nó mất nhiều thời gian hơn nó muốn chờ đợi, tôi có thể làm gì nếu trang web đó chậm?

+0

Đây là thời gian chờ yêu cầu, sẽ diễn ra sau 30 giây. Vì yêu cầu URLFetch được giới hạn trong 10 giây, bạn phải làm nhiều hơn chỉ một cuộc gọi này. Bạn đang làm gì đấy? –

+0

Có, tôi đã nhận được nội dung trang từ 6 danh mục và xem nơi NMJava của tôi được xếp hạng, vì vậy phải mất nhiều thời gian hơn khi nó đi qua từng trang để tìm tên NMJava và tính toán nơi nó đứng trên tất cả. – Frank

+1

Bạn có cân nhắc sử dụng URLFetch không đồng bộ không? Điều đó sẽ cho phép bạn thực hiện tất cả các yêu cầu song song. –

Trả lời

3

A DeadlineExceededException được ném khi mã của bạn, xử lý yêu cầu đến ứng dụng web của bạn mất hơn 30 giây để xử lý. Có lẽ mã của bạn mất một thời gian để xử lý vì khoảng thời gian phải đợi để nhận dữ liệu từ một số trang web khác.

Bạn có thể tạo một tác vụ trên task queue để tìm nạp và xử lý dữ liệu đó và thay đổi yêu cầu web/luồng phản hồi của bạn để trả lời với tiến trình trong tác vụ của bạn.

+1

Ngoại lệ đang gặp phải là thời hạn yêu cầu, không phải là thời hạn của URLFetch. –

+0

@Nick điểm tốt tôi sẽ sửa đổi câu trả lời của tôi. –

+0

Woo, có vẻ phức tạp, bất kỳ mã mẫu nào để thực hiện điều này trên trang web của Máy ứng dụng của Google? Nó sẽ rất hữu ích. – Frank

2

Nếu mã của bạn đang chạy bên trong trình xử lý yêu cầu, thì theo mặc định có thời hạn 60 giây được thi hành bởi App-Engine. Bạn không thể thay đổi nó. Hãy xem phần "Thời hạn" hàng/"mở rộng quy mô tự động" cột của bảng xếp hạng trên trang này thuộc "loại Scaling":

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

Tuy nhiên, mã này sẽ có thể chạy trong vài giờ nếu bạn thay đổi mô-đun của bạn sử dụng "chia tỷ lệ thủ công" và phiên bản "B1" - "B4". Ví dụ:

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

On loại này cấp sơ thẩm, yêu cầu của bạn thường sẽ không thời gian ra hàng giờ đồng hồ. (Tài liệu cho rằng thời hạn là "không xác định".)