2012-03-21 8 views
2

私はプルキューをバックエンドで処理していますが、キューが空のときに別のスクリプトをトリガーする必要があります。Google App Engineのタスクキューのフェッチ統計が失敗する

現時点では、キューからタスクをリースするメソッドで非常に粗い検出を使用しています。したがって、返されたタスクリストが空であれば、リースして次のステップをトリガーすることはできません。ただし、ほとんどの場合、これが機能しますが、利用可能なタスクがあるにもかかわらず、リース要求が空のリストを返すように見えることがあります。

とにかく、もっと良い方法は、キューのfetch_statisticsメソッドを使うことです。こうすることで、スクリプトはプルキューで何が起きているのかを監視し、キューに残っているアイテムがなくなったことを知ることができます。今これは明らかにキューのREST APIを介して利用可能ですが、私はこれらを内部的に使用しているときにこれを使用するのは逆のようです。

私はQueue.fetch_statistics()呼び出しを行っていますが、エラーをスローします。私はGoogleに記載されたエラーを入れてみましたが、何も返しません。同じstackoverflowでここに。

それは常にスロー:

AttributeError: type object 'QueueStatistics' has no attribute '_QueueStatistics__TranslateError' 

を私のコードは次のとおりです。

q = taskqueue.Queue('reporting-pull') 
    try: 
     logging.debug(q.fetch_statistics()) 
    except Exception, e: 
     logging.exception(e) 

誰もがこの上の任意の光を当てることができますか?私はここで本当に馬鹿なことをやっているのですか?

+0

AFAIK [Queue](http://code.google.com/appengine/docs/python/taskqueue/queues.html)にはfetch_statisticsメソッドがありません –

+0

これは確かにコードsdkにありますが、その文書化されていない。これは、REST APIサービス用にJSONifiedされたメソッドです。タスクキュー内にある。PYライン1810 'デフfetch_statistics(自己): 「」「このキューに関する現在の詳細を取得 戻り値:このキューについての情報を含む A QueueStatisticsインスタンス 『』」 リターンQueueStatistics.fetch(自己) ' また、スローされた例外はメソッドから返されたオブジェクトに関連し、メソッド自体は存在しません。実行時に若干異なる場合があります。 –

+0

文書化されていないAPIを使用している場合、プロバイダーがあなたを切断して壊すことができる瞬間はどこにでもあります。 –

答えて

2

タスクキュー統計APIが文書化され、一般に公開されました。エラーは発生しなくなりました。

1

特定のエラーが発生した直後の理由は、コードのバグであるようです。 QueueStatistics.fetch()は、QueueStatistics._FetchMultipleQueues()を呼び出すと、明らかにapiproxy_errors.ApplicationErrorが発生し、次にcls .__ TranslateError()を呼び出そうとしますが、QueueStatisticsクラスにはそのようなメソッドはありません。

私はApplicationErrorの深い理由はわかりませんが、機能がまだ実働ランタイムでサポートされていない可能性があります。

+1

ありがとうございました!私はトップの人に反応することを期待していなかった! SDKの残りのAPIがJSON化する前に同じ機能を使用しているように見えるので、私はちょっと考えました。問題は、私はREST APIを使って何が戻ってきたのか見てみることにしました。これは、実稼働時にはうまくいくようです。 [u'oldestTask ':u'0'、u'leasedLastMinute ':u'4'、u'leasedLastHour ':u'4'、 'u'leasedLastMinute': 'u'4ind' u'totalTask​​s ':0}。それは自分のキューのために残りのAPIのauthにappidentityを使用する少し奇妙に思えますが、それは動作し、私のためにやる! –

3

他の誰にとっても便利なことに、あなたのアプリケーションからキュー情報を取得するための関数例があります。その唯一の例であり、より良いエラー処理を行うことができますが、それはあなたを動かすべきです。以前はTaskqueueクライアントを使用していましたが、とにかくコード内でリースして削除できるようになると少し不安だったので、アプリIDを使用していました。

from google.appengine.api import taskqueue 
from google.appengine.api import app_identity 
from google.appengine.api import urlfetch 
try: 
    import json 
except ImportError: 
    import simplejson as json 
import logging 

def get_queue_info(queue_name, stats=False): 
    ''' 
     Uses the Queue REST API to fetch queue info 
     Args: 
      queue_name: string - the name of the queue 
      stats: boolean - get the stats info too 
     RETURNS: 
      DICT: from the JSON response or False on fail 
    ''' 
    scope = 'https://www.googleapis.com/auth/taskqueue' 
    authorization_token, _ = app_identity.get_access_token(scope) 
    app_id = app_identity.get_application_id() 
    #note the s~ denoting HRD its not mentioned in the docs as far as 
    #I can see, but it wont work without it 
    uri = 'https://www.googleapis.com/taskqueue/v1beta1/projects/s~%s/taskqueues/%s?getStats=%s' % (app_id, queue_name, stats) 
    #make the call to the API 
    response = urlfetch.fetch(uri, method="GET", headers = {"Authorization": "OAuth " + authorization_token}) 
    if response.status_code == 200: 
     result = json.loads(response.content) 
    else: 
     logging.error('could not get queue') 
     logging.error(response.status_code) 
     logging.error(response.content) 
     return False 


    return result 

は、私は誰かが、これは重宝願ってアプリの身元

-name: queue_name 
mode: pull 
acl: 
- user_email: [email protected] 

のACLを使用してqueue.yamlを更新することを忘れないでください。

私がQueueオブジェクトでこれを行うことができるように、その間に私はFeatureリクエストを投稿しました。 http://goo.gl/W8Pk1

+0

どういうわけか、あなたの機能リクエストは「無効」とマークされています – Ryan

関連する問題