2011-09-30 6 views
3

メーリングリストのメールアドレスごとにタスクキューを追加するPython関数を持っています。私のGoogle App Engine Mail API呼び出しは、タスクキューに入れても、DeadlineExceededErrorが発生するのはなぜですか?

DeadlineExceededError: The API call mail.Send() took too long to respond and was cancelled.

どれ解決策:この問題は、各メールは、タスクキューに実行を介して送信されることになっていたにもかかわらず、私はまだこの恐ろしいエラーが出るということですか?

答えて

1

mail.Sendコールを処理するGAEインスタンスとRPCサーバー間の通信中に期限が切れています。これは、GAEの内部問題、または(可能性が高い)タイムリーな方法でSMTPサーバーとの通信の失敗を示す可能性があります。

後者は、概念的には、URLFetch呼び出しの期限と非常によく似ています。ただし、URLFetchのカスタム期限を設定して、その問題を大幅に軽減することは可能です。

残念ながら、Mail APIの類推には文書化されていません。しかし、EmailMessage.send()のパラメータとして、自分のmake_sync_callメソッド(より寛大な締め切りを可能にする)を提供するという回避策があります。このようなメソッドを作成するには、GAE RPC呼び出しを行うために使用されるPythonのインターフェイスの内部を掘り下げて調べる必要があります。あなたはその結果のmake_sync_call方法で表彰されますカスタム期限を供給するために使用することができ

from google.appengine.api import apiproxy_stub_map 
from google.appengine.api.apiproxy_stub_map import APIProxyStubMap 

class TimeoutAPIStub(object): 
    def __init__(self, service, deadline = 25): 
     self.service = service 
     self.deadline = deadline 

    def CreateRPC(self): 
     rpc = apiproxy_stub_map.CreateRPC(self.service) 
     rpc.deadline = self.deadline 
     return rpc 

def create_MakeSyncCall(service, deadline = 25): 
    apsm = APIProxyStubMap() 
    apsm.RegisterStub(service, TimeoutAPIStub(service, deadline)) 
    return apsm.MakeSyncCall 

:次のように解決策は、私が働いてルックスを見つけるあなたが詳細をお知りになりたい場合は

msg = EmailMessage() 
# ... prepare your email ... 
msg.send(make_sync_call = create_MakeSyncCall('mail', deadline = 300)) 

GAE RPC呼び出しのカーテンの下で何が起こるか、私はNick Johnson's blog post about itを読むことを提案する。これは、同様の問題を解決するためにPythonのGAE RPCバインディングを使いたいと思っていれば良い出発点です。

+0

これはそれです。基本的には、1回のハンドラ呼び出しで何千ものRCP呼び出しを作成しようとしています。これを回避するには、代わりに_one_タスクを作成します。そのタスクは、問題を(何千人もの人にメールして)小さなタスクに刻み込むことです。 –

+0

mail.Send()への呼び出しをタスクキューにサブミットできませんでした。失敗した場合は自動的に再試行されますか? –