추적하기가 힘들었던 오류가 발생하여 여기에 원인 + "해결책"을 추가 할 것이라고 생각했습니다.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'처럼 보입니다.
당신이 여기서 뭘하는지 분명히 모릅니다. "원격 클라이언트"란 무엇이며, 무엇을하고 있습니까? 다른 컴퓨터에서 작업을 대기열에 추가하는 URL을 가져 오는 것으로 가정하지만 작업 재시도와 관련이 있습니까? –
네, 특정 URL을 가져 오면 작업을 시작하는 간단한 응용 프로그램이었고 로컬 개발 환경 (MacBook에서 실행중인 GoogleAppEngineLauncher)에서 테스트하려고했습니다. 여기에있는 속임수는 URL을 가져 오는 클라이언트가 dev_appserver가 일반적으로 바인드하는 루프백을 통해 브라우저가 아닌 다른 시스템 (다른 IP 주소 사용)이었습니다. –
AppEngine은 HTTP 요청에서 클라이언트가 제공 한 호스트 이름을 사용하여 작업의 절대 URL을 생성하므로 작업에 실패했습니다. 클라이언트가 호스트 파일에 정의 된 이름을 사용하면 이름을 확인할 수 없을 때 서버에서 작업을 생성 할 수 없습니다. –