私は追跡するのが苦労したエラーに遭遇したので、ここで原因+「解決策」を追加すると思いました。AppEngine:タスクを開始するときにゲーラー
セットアップ: Devbox - タスクを起動するURLを提供するすべてのポート( "--address = 0.0.0.0")でリッスンするGoogle App Engineを実行しています。 クライアント - コールバックURLを照会クライアント(Pythonの要求ライブラリー)
App Engineのコード:私は私のブラウザでコールバックを照会し、すべてが働いていたが、リモートクライアントから同じクエリが与えた
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を生成するため、タスクが失敗していました。クライアントがhostsファイルで定義された名前を使用すると、名前を解決できないときにタスクがサーバー上に作成されません。 –