2012-03-23 9 views
0

Ich lief in einen Fehler, der schmerzhaft ausfindig zu machen war, also dachte ich, ich würde hier die Ursache + "Lösung" hinzufügen.AppEngine: gaierror beim Starten einer Aufgabe

Das Setup: Devbox - Ausführen von Google App Engine, die alle Ports überwacht ("--address = 0.0.0.0") und eine URL bereitstellt, die eine Aufgabe startet. -Client - Client (Python-Anfragen Bibliothek), die die Callback-URL abfragt

App Engine-Code:

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) 

Als ich den Rückruf mit meinem Browser abgefragt, alles hat funktioniert, aber die gleiche Abfrage von dem entfernten Client gab Ich habe den folgenden Fehler:

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 

Dieser Fehler würde nur in einer Schleife drehen, wie die Aufgabe erneut versucht. Seltsamerweise könnte ich aber zu Admin -> Task Queues gehen und auf 'Run' klicken, um die Aufgabe erfolgreich abzuschließen.

Zuerst dachte ich, das war ein Fehler mit der Bindung. Ich würde keinen Fehler erhalten, wenn ich den StartTaskCallback über den Browser abgefragt habe oder wenn ich den Client lokal ausgeführt habe.

Endlich habe ich festgestellt, dass App Engine das 'Host'-Feld der Anfrage verwendet, um eine absolute URL für die Aufgabe zu erstellen. In /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) 

In meinem Fall, Ich benutzte einen speziellen Namen + Hosts-Datei auf dem Remote-Client, um auf den Server zuzugreifen. 192.168.1.208 devbox So sah der "Host" für den Remote-Client wie "devbox: 8085" aus, die der lokale Server nicht auflösen konnte.

+0

Es ist wirklich nicht klar für mich, was Sie hier tun. Was ist "der Remote Client" und was macht er? Ich gehe davon aus, dass Sie die URL abrufen, die eine Aufgabe von einer anderen Maschine in die Warteschlange stellt, aber was hat das mit Aufgabenwiederholungen zu tun? –

+0

Ja, es war eine einfache App, die eine Aufgabe startet, wenn eine bestimmte URL abgerufen wird, und ich habe versucht, sie in meiner lokalen Entwicklungsumgebung (GoogleAppEngineLauncher auf einem Macbook) zu testen. Der Trick dabei ist, dass der Client, der die URL abruft, ein anderer Computer (mit einer anderen IP-Adresse) als ein Browser über dem Loopback ist, an den dev_appserver normalerweise bindet. –

+0

Die Aufgabe ist fehlgeschlagen, weil AppEngine den vom Client in seiner HTTP-Anforderung angegebenen Hostnamen verwendet, um eine absolute URL für die Aufgabe zu generieren. Wenn der Client einen in seiner hosts-Datei definierten Namen verwendet, kann der Task nicht auf dem Server erstellt werden, wenn er den Namen nicht auflösen kann. –

Antwort

2

Um das Problem zu beheben, fügte ich einfach devbox zu meinem Host-Datei AppEngine-Server, aber es wäre sicher schön gewesen, wenn die gaierror Ausnahme den Namen gedruckt hatte, der nicht gelöst werden konnte, oder wenn App Engine nicht verwendet ' Host 'der eingehenden Anfrage, um eine URL für die Aufgabenerstellung zu erstellen.

Verwandte Themen