Статистика выборки очереди задач Google App Engine не удалась - PullRequest
2 голосов
/ 21 марта 2012

У меня есть очередь извлечения, обслуживаемая бэкэндом, и когда очередь пуста, мне нужно запустить другой сценарий.

В настоящее время я использую очень грубое обнаружение в методе, который арендует задачи из очереди, поэтому, если возвращаемый список задач пуст, мы предполагаем, что больше нет аренды и инициируем следующий шаг. Однако, хотя это работает большую часть времени, иногда кажется, что запрос на аренду возвращает пустой список, даже если есть доступные задачи.

В любом случае, я думаю, что лучший способ сделать это - использовать метод fetch_statistics в Queue. Таким образом, сценарий может отслеживать, что происходит в очереди извлечения, и знать, что в очереди больше нет элементов. Теперь это очевидно доступно через API REST для очередей, но, кажется, довольно неудобно использовать это, когда я использую их внутри.

Итак, я делаю вызов 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 ]

3 голосов
/ 23 марта 2012

Просто, если это полезно для всех, вот пример функции, которая поможет вам начать получать информацию об очередях из вашего приложения.Это всего лишь пример, и он может улучшить обработку ошибок, но он должен помочь вам.Ранее мы использовали клиент 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

Незабудьте обновить свой queue.yaml с помощью acl для вашего приложения

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

Я надеюсь, что кто-то найдет это полезным.

Тем временем я разместил запрос на функцию, чтобы мы могли сделать этос объектом Queue, пожалуйста, перейдите и пометьте его, если вы тоже этого хотите.http://goo.gl/W8Pk1

2 голосов
/ 14 мая 2012

API статистики очереди заданий теперь задокументирован и общедоступен. Ошибка больше не возникает.

1 голос
/ 23 марта 2012

Непосредственной причиной конкретной ошибки, которую вы получаете, является ошибка в коде; Queue.fetch_statistics () вызывает QueueStatistics.fetch () вызывает QueueStatistics._FetchMultipleQueues (), которая, очевидно, сталкивается с apiproxy_errors.ApplicationError, а затем пытается вызвать cls .__ TranslateError (), но такого метода в классе QueueStatistics нет.

Я не знаю более глубокой причины ApplicationError, но это может означать, что эта функция еще не поддерживается рабочей средой выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...