2013-02-13 27 views
1

我創建了一個App引擎後端爲長時間運行的進程提供http請求。當查詢引用小尺寸的輸入時,後端進程按預期工作,但當輸入尺寸很大時超時。查詢參數是App Engine BlobStore blob的url,後者是後端進程的輸入數據。我認爲使用App Engine後端的關鍵在於避免超時限制App Engine前端擁有。我怎樣才能避免超時?請求引擎後端計時

我把這樣的後端,設置連接超時長度無限:

HttpURLConnection connection = (HttpURLConnection)(new URL(url + "?" + query).openConnection()); connection.setRequestProperty("Accept-Charset", charset); connection.setRequestMethod("GET"); connection.setConnectTimeout(0); connection.connect(); InputStream in = connection.getInputStream(); int ch; while ((ch = in.read()) != -1) json = json + String.valueOf((char) ch); System.out.println("Response Message is: " + json); connection.disconnect();

(編輯匿名)回溯是:

Uncaught exception from servlet java.net.SocketTimeoutException: Timeout while fetching URL: http://my-backend.myapp.appspot.com/somemethod?someparameter=AMIfv97IBE43y1pFaLNSKO1hAH1U4cpB45dc756FzVAyifPner8_TCJbg1pPMwMulsGnObJTgiC2I6G6CdWpSrH8TrRBO9x8BG_No26AM9LmGSkcbQZiilhC_-KGLx17mrS6QOLsUm3JFY88h8TnFNer5N6-cl0iKA at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:142) at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:43) at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:417) at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:296) at org.someorg.server.HUDXML3UploadService.doPost(SomeService.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

正如你所看到的,我沒有收到DeadlineExceededException,所以我認爲Google的限制之外的東西導致超時,並且使這個問題與類似的stackoverflow帖子不同 話題。

我虛心地感謝你的任何見解。

更新2/19/2012:我想,看看發生了什麼。我應該可以讓客戶端使用GWT [或任何其他類型的客戶端異步框架]異步處理程序無限期地等待任何客戶端請求來完成,所以我不認爲這是問題所在。問題在於文件上傳正在調用_ah/upload App Engine系統端點,然後在blob存儲在Blobstore中之後)調用上傳服務的doPost後端來處理blob。客戶端對_ah/upload的請求是超時的,因爲後端不能及時返回。爲了讓這個超時問題消失,我試圖使_ah_upload服務本身成爲可通過http://backend_name.project_name.appspot.com/_ah/upload訪問的公共後端,但我認爲google不允許系統服務(如_ah/upload)作爲後端運行。現在我的下一個方法是在觸發後端處理後立即返回ah_upload,然後在處理完成後調用另一個服務以獲取我想要的原始響應。

+1

你是從前端實例的後端獲取?如果是這樣,那麼我想這是前端超時,而不是後端。如果是這種情況,請嘗試將後端公開並直接訪問處理程序(正如您根據引用中的URL所做的那樣)。 – 2013-02-13 17:54:58

+0

保羅,請求來自公共後端,我也運行。我最初的請求來自前端,但懷疑這是問題所在,所以我將它移到了後端。我停止接收嚴格的截止日期例外,但仍然得到這些超時。 – elmor 2013-02-13 17:58:54

+1

然後我不知道,我在Python方面工作,所以我不能進一步進展,我害怕。只要你沒有觸發請求,然後通過前端實例在任何級別等待響應(即你應該只是通過一個處理程序來檢查更新,該處理程序只是立即返回狀態,而不管後端作業狀態如何),那麼我'茫然。 – 2013-02-13 18:04:53

回答

0

解決方案是將後端進程作爲任務啓動,並將其添加到任務隊列中,然後在等待處理後端任務(可能需要很長時間)之前向客戶端返回響應。如果我可以將ah_upload分配給後端,這也可以解決問題,因爲客戶端異步處理程序可能會永久等待後端完成,但我認爲Google不允許將系統Servlet分配到後端。正如Paul C所說,客戶端現在必須輪詢持久化的後端進程響應數據,因爲任務無法像普通的servlet那樣響應。