2012-03-23 4 views
0

추적하기가 힘들었던 오류가 발생하여 여기에 원인 + "해결책"을 추가 할 것이라고 생각했습니다.AppEngine : 작업 시작시 게이머

설정 : Devbox - 작업을 시작하는 URL을 제공하는 모든 포트에서 Google App Engine 수신 대기 ("--address = 0.0.0.0")를 실행 중입니다. 클라이언트 - 콜백 URL을 조회 클라이언트 (파이썬 요청 라이브러리)

앱 엔진 코드 : 내 브라우저에서 콜백을 조회, 모든 일을하지만, 원격 클라이언트에서 동일한 쿼리 준

class StartTaskCallback(webapp.RequestHandler): 
    def post(self): 
    param = self.request.get('param') 
    logging.info('STARTTASK: %s' % param) 
    # launch a task 
    taskqueue.add(url='/tasks/mytask', 
        queue_name='myqueue', 
        params={'param': param}) 

class MyTask(webapp.RequestHandler): 
    def post(self): 
    param = self.request.get('param') 
    logging.info('MYTASK: param = %s' % param) 

다음 오류 :

ERROR 2012-03-23 21:18:27,351 taskqueue_stub.py:1858] An error occured while sending the task "task1" (Url: "/tasks/mytask") in queue "myqueue". Treating as a task error. 
Traceback (most recent call last): 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/taskqueue/taskqueue_stub.py", line 1846, in ExecuteTask 
    connection.endheaders() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 868, in endheaders 
    self._send_output() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 740, in _send_output 
    self.send(msg) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 699, in send 
    self.connect() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/httplib.py", line 683, in connect 
    self.timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 498, in create_connection 
    for res in getaddrinfo(host, port, 0, SOCK_STREAM): 
gaierror: [Errno 8] nodename nor servname provided, or not known 

이 오류는 작업이 다시 시도 될 때 반복됩니다. 이상하게도 Admin -> Task Queues로 가서 'Run'을 클릭하면 작업을 성공적으로 완료 할 수 있습니다.

처음에는 이것이 바인딩의 오류라고 생각했습니다. 브라우저를 통해 StartTaskCallback을 쿼리하거나 로컬로 클라이언트를 실행하면 오류가 발생하지 않습니다.

마지막으로 App Engine이 요청의 '호스트'입력란을 사용하여 작업의 절대 URL을 작성한 것으로 나타났습니다. /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/taskqueue/taskqueue_stub.py (1829)에서 :

내 경우
connection_host, = header_dict.get('host', [self._default_host]) 
    if connection_host is None: 
    logging.error('Could not determine where to send the task "%s" ' 
        '(Url: "%s") in queue "%s". Treating as an error.', 
        task.task_name(), task.url(), queue.queue_name) 
    return False 
    connection = httplib.HTTPConnection(connection_host) 

, 원격 클라이언트에서 서버에 액세스하기 위해 특별한 이름 + 호스트 파일을 사용하고있었습니다. 192.168.1.208 devbox 그래서 원격 클라이언트의 '호스트'는 로컬 서버가 해결할 수없는 'devbox : 8085'처럼 보입니다.

+0

당신이 여기서 뭘하는지 분명히 모릅니다. "원격 클라이언트"란 무엇이며, 무엇을하고 있습니까? 다른 컴퓨터에서 작업을 대기열에 추가하는 URL을 가져 오는 것으로 가정하지만 작업 재시도와 관련이 있습니까? –

+0

네, 특정 URL을 가져 오면 작업을 시작하는 간단한 응용 프로그램이었고 로컬 개발 환경 (MacBook에서 실행중인 GoogleAppEngineLauncher)에서 테스트하려고했습니다. 여기에있는 속임수는 URL을 가져 오는 클라이언트가 dev_appserver가 일반적으로 바인드하는 루프백을 통해 브라우저가 아닌 다른 시스템 (다른 IP 주소 사용)이었습니다. –

+0

AppEngine은 HTTP 요청에서 클라이언트가 제공 한 호스트 이름을 사용하여 작업의 절대 URL을 생성하므로 작업에 실패했습니다. 클라이언트가 호스트 파일에 정의 된 이름을 사용하면 이름을 확인할 수 없을 때 서버에서 작업을 생성 할 수 없습니다. –

답변

2

문제를 해결하기 위해 App Engine 서버의 호스트 파일에 devbox를 추가했지만 gaierror 예외가 해결되지 않은 이름을 인쇄했거나 App Engine에서 ' 호스트 '를 생성하여 작업 생성을위한 URL을 작성하십시오.