Google App Engine任务队列提取统计信息失败

时间:2012-03-21 09:56:04

标签: python google-app-engine

我有一个由后端提供服务的拉队列,当队列为空时我需要触发另一个脚本。

目前我在从队列中租用任务的方法中使用非常粗略的检测,因此如果返回的任务列表为空,我们假设没有更多的租约并触发下一步。但是,虽然这在大多数情况下都有效,但即使有任务可用,租约请求偶尔也会返回一个空列表。

无论如何,我认为更好的方法是使用Queue的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)

任何人都可以对此有所了解吗?我在这里做了一些非常愚蠢的事情吗?

3 个答案:

答案 0 :(得分:3)

只是对其他人有用,这是一个示例函数,让您开始从您的应用程序获取队列信息。它只是一个例子,可以做更好的错误处理,但它应该让你启动并运行。以前我们已经使用了Taskqueue客户端,但我认为这有点矫枉过正,因为我们可以在代码中租用和删除,所以我使用了应用程序标识,并且它起了作用。

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

不要忘记使用您的应用标识的acl更新您的queue.yaml

-name: queue_name
 mode: pull
 acl:
 - user_email: myappid@appspot.gserviceaccount.com

我希望有人觉得这很有用。

与此同时,我发布了一个功能请求,因此我们可以使用Queue对象执行此操作,如果您也需要,请将其加注星标。 http://goo.gl/W8Pk1

答案 1 :(得分:2)

现在,任务队列统计API已记录在案并可公开获取。错误不再发生。

答案 2 :(得分:1)

您遇到的特定错误的直接原因似乎是代码中的错误; Queue.fetch_statistics()调用QueueStatistics.fetch()调用QueueStatistics._FetchMultipleQueues(),它显然遇到apiproxy_errors.ApplicationError,然后尝试调用cls .__ TranslateError(),但QueueStatistics类上没有这样的方法。

我不知道ApplicationError的深层原因,但这可能意味着生产运行时尚不支持该功能。