2013-02-13 1 views
1

장기 실행 프로세스에 대한 http 요청을 처리하기 위해 App Engine 백엔드를 만들었습니다. 백엔드 프로세스는 쿼리가 작은 크기의 입력을 참조하지만 입력 크기가 클 때 시간 초과 될 때 예상대로 작동합니다. query 매개 변수는 App Engine BlobStore blob의 URL이며 백엔드 프로세스의 입력 데이터입니다. App Engine 백엔드 사용의 전체적인 포인트는 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을 얻지 못하고있다. 그래서 나는 구글의 한계가 아닌 다른 것이 타임 아웃을 일으키고 있다고 생각한다. 또한 이와 비슷한 stackoverflow posts와는 다른 이슈를 만들고있다. 주제.

나는 어떤 통찰력에 대해서도 겸허히 감사드립니다.

업데이트 2/19/2012 : 나는 무슨 일이 벌어지고 있는지 알고 있습니다. 나는 어떤 클라이언트 요청을 완료하기 위해 GWT [또는 다른 유형의 클라이언트 측 비동기 프레임 워크] 비동기 처리기를 사용하여 클라이언트가 무기한 기다려야 할 수 있어야하므로 문제라고 생각하지 않습니다. 문제는 파일 업로드가 _ah/upload App Engine 시스템 끝점을 호출하고 Blobstore에 BLOB가 저장되면 업로드 서비스의 doPost 백엔드를 호출하여 BLOB를 처리한다는 것입니다. 백엔드가 적시에 반환하지 않기 때문에 _ah/업로드에 대한 클라이언트 요청이 시간 초과됩니다. 이 시간 초과 문제를 해결하기 위해 _ach_upload 서비스 자체를 http://backend_name.project_name.appspot.com/_ah/upload을 통해 액세스 할 수있는 공용 백엔드로 만들려고했지만 Google에서 시스템 서비스 (예 : _ah/업로드)를 백엔드로 실행할 수 있다고 생각하지 않습니다. 이제 내 다음 접근법은 백엔드 처리를 트리거 한 후 즉시 ah_upload를 리턴 한 다음 처리가 완료된 후 원하는 원래 응답을 얻기 위해 다른 서비스를 호출하는 것입니다.

+1

프런트 엔드 인스턴스의 백엔드에서 페치 중입니까? 그렇다면 나는 그것이 백엔드가 아닌 타임 아웃 프론트 엔드라고 생각한다. 그런 경우에는 백엔드를 공개로 설정하고 핸들러에 직접 액세스하십시오 (트랙백의 URL에 따라 수행). –

+0

Paul, 내가 요청한 공개 백엔드 요청이 있습니다. 원래 프론트 엔드에서 요청을 받았지만 이것이 문제라고 의심되어서 백엔드로 옮겼습니다. 나는 엄격한 마감 시간 예외를받지 못하게했지만, 여전히 이러한 타임 아웃을 얻고 있습니다. – elmor

+1

그럼 모르겠지만 파이썬 쪽에서 일하므로 더 이상 진전이되지 않을까 걱정됩니다. 오랫동안 요청을 트리거하지 않고 어떤 레벨에서든 프론트 엔드 인스턴스를 통해 응답을 기다리는 경우 (즉, 백엔드 작업 상태에 관계없이 즉시 상태를 반환하는 핸들러를 통해 업데이트를 확인해야 함) 난 손실. –

답변

0

해결 방법은 작업으로 백엔드 프로세스를 시작하고 작업 대기열에 추가 한 다음 백엔드 작업을 처리하기 위해 대기하기 전에 클라이언트에 응답을 반환하는 것입니다 (오랜 시간이 걸릴 수 있음). clien't 비동기 처리기가 백엔드가 끝나기를 영원히 기다릴 수 있기 때문에 백엔드에 ah_upload를 할당 할 수 있었다면 문제도 해결할 수 있었지만 Google이 백엔드에 시스템 서블릿을 할당하는 것을 허용하지 않는다고 생각합니다. Paul C가 말했듯이 클라이언트는 정상적인 서블릿처럼 작업을 수행 할 수 없으므로 지속성있는 백엔드 프로세스 응답 데이터를 폴링해야합니다.

관련 문제