2012-11-07 14 views
7

Ich benutze GAE Python 2.7 mit dem lokalen Entwicklungsserver. Ich habe ein Backend konfiguriertApp Engine Python Entwicklungsserver + Taskqueue + Backend

backends: 
- name: worker 
    class: B1 
    options: dynamic 

und ich verwende die Standard-Aufgabenwarteschlange. Alles funktioniert gut und das Backend und die Task-Warteschlange sind in der SDK-Konsole sichtbar. Auch die lokale Entwicklungsarbeit beginnt ohne Fehler:

Multiprocess Setup Complete: 
Remote API Server [http://localhost:9200] 
App Instance [http://localhost:9000] 
Backend Instance: worker.0 [http://localhost:9100] 
Backend Balancer: worker [http://localhost:9199] 

aber wenn ich versuche, das Backend über eine Aufgabe zu adressieren

taskqueue.add(url='/xyz', method='POST', target='worker', params={'a':'b'}) 

dieser Fehler aufwirft:

ERROR An error occured while sending the task "task1" (Url: "/backend/languages/create_database/") in queue "default". 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 1884, in ExecuteTask 
    connection.endheaders() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 937, in endheaders 
    self._send_output(message_body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 797, in _send_output 
    self.send(msg) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 759, in send 
    self.connect() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 740, in connect 
    self.timeout, self.source_address) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 553, in create_connection 
    for res in getaddrinfo(host, port, 0, SOCK_STREAM): 
gaierror: [Errno 8] nodename nor servname provided, or not known 

Ich verwende 'localhost' und kann keinen Grund sehen, warum es fehlschlägt. Einige Ideen/Lösungen? Irgendein startup-Parameter fehlt oder so?

Dank

+0

Können Sie Ihre 'taskqueue.add' Anweisung bearbeiten? – bossylobster

+0

Natürlich könnte ich die Anweisung ohne "Ziel" ausführen, es läuft ohne Fehler. Aber mein Ziel ist die Ausführung auf dem Backend-Server :-) – user1806561

+0

Gleiches Problem hier. –

Antwort

8

Es ist ein Fehler in taskqueue.py verfehlt einen Fall zwischen der Produktion und der Entwicklungsumgebung zu unterscheiden.

In der Produktion macht es das Richtige, indem es die target mit der hostname verkettet.

In der Entwicklung funktioniert das nicht und wird den Fehler, den Sie gemeldet haben, wenn Sie versuchen, worker.localhost Adresse aufzulösen.

Stattdessen sollte es den Task-Host auf die ip:port dev_appserver aktiviert das Back-End aktiviert.

Es gibt bereits einen bug im öffentlichen Issue-Tracker, der an das Engineering-Team eskaliert wurde.

Fühlen Sie sich frei, es zu markieren, wenn Sie über Updates benachrichtigt werden möchten.

+0

Also irgendeine Lösung dafür? Oder können wir uns nicht mehr auf dem Dev-Server entwickeln? –

+0

Sie sollten http://code.google.com/p/googleappengine/issues/detail?id=5105 ins Netz gehen, um über das Update zu diesem Problem informiert zu werden. – proppy

+0

@JimmyKane, siehe unten eine kleine Problemumgehung, die mir hilft, Backend-Dienste lokal zu debuggen. –

1

Es gibt eine Abhilfe, die mir lokal debuggen hilft:

if os.environ['SERVER_SOFTWARE'].startswith('Development'): 
    taskqueue.add(url='/task', params={...}) 
else:  
    taskqueue.add(url='/task', params={...}, target='backendservername') 

In diesem Fall, wenn wir lokal debuggen, wir die Aufgabe in der regulären Task-Warteschlange laufen. Wenn wir diesen Code in App Engine einfügen, startet er die Aufgabe mit einem Backend-Server.

+0

Geben Sie die PORT-Nummer mit dieser if-Anweisung an? – Andrew

+0

@Andrew, nein, ich gebe keine Portnummern an. –

+0

In diesem Fall verstehe ich die Lösung nicht vollständig. Im obigen Beispiel wird der Task weiterhin an Port 80 (im Gegensatz zu 8080) geleitet. Ich habe zwar den Port über target = 'localhost: 8080' angegeben, aber du nimmst diesen Ansatz nicht ... Ich verstehe nicht, wie "taskqueue.add (url = '/ task', params = { ...}) "löst dieses Problem. – Andrew