应用引擎无法添加任务以在localhost中推送队列

时间:2016-09-29 12:39:50

标签: google-app-engine google-cloud-platform

想要测试简单任务添加到队列 我有这个脚本。

import os, sys

test_directory = os.path.dirname(os.path.abspath(__file__))
paths = [
    '/../../google_appengine',
]

for path in paths:
    sys.path.insert(0, os.path.abspath(test_directory + path))

from google.appengine.api import taskqueue


QUEUE_NAME = 'default'

import os
import unittest

from google.appengine.api import taskqueue
from google.appengine.ext import testbed


class TaskQueueTestCase(unittest.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()

        # root_path must be set the the location of queue.yaml.
        # Otherwise, only the 'default' queue will be available.
        self.testbed.init_taskqueue_stub(
            root_path=os.path.join(os.path.dirname(__file__), 'resources'))
        self.taskqueue_stub = self.testbed.get_stub(
            testbed.TASKQUEUE_SERVICE_NAME)

    def tearDown(self):
        self.testbed.deactivate()

    def testTaskAddedToQueue(self):
        taskqueue.Task(name='my_task', url='/url/of/my/task/').add(QUEUE_NAME)
        tasks = self.taskqueue_stub.get_filtered_tasks(QUEUE_NAME)
        assert len(tasks) == 1
        assert tasks[0].name == 'my_task'


aaa = TaskQueueTestCase('setUp')
aaa()
aaa.testTaskAddedToQueue()

如果试图运行

 taskqueue.Task(name='my_task', url='/url/of/my/task/').add(QUEUE_NAME)

获取TaskAlreadyExistsError

但是在尝试计算得到0的任务数时

self.taskqueue_stub.get_filtered_tasks(QUEUE_NAME)  # getting [] here

也尝试了

q = taskqueue.Queue('slowQueue')
task = taskqueue.Task(url='/worker/slow', params={'name': 'myname'})
q.add(task)

获取UnknownQueueError

我使用

运行了本地服务器
 dev_appserver.py -A asdfasdf  worker.yaml
INFO     2016-10-05 11:00:47,730 devappserver2.py:769] Skipping SDK update check.
INFO     2016-10-05 11:00:47,819 api_server.py:205] Starting API server at: http://localhost:62568
INFO     2016-10-05 11:00:47,822 dispatcher.py:197] Starting module "worker" running at: http://localhost:8080
INFO     2016-10-05 11:00:47,825 admin_server.py:116] Starting admin server at: http://localhost:8000
WARNING  2016-10-05 11:00:47,825 devappserver2.py:835] No default module found. Ignoring.

local server for push queues

这是worker.yaml

queue:
- name: ohad
  bucket_size: 1
  rate: 1/s

如何在我的代码中定义将消息推送到localhost服务器?

应用程序,引擎和推送队列的新功能。 请帮忙。

1 个答案:

答案 0 :(得分:2)

来自Naming a task(强调我的):

  

任务名称在队列中必须是唯一的。如果您尝试将另一个具有相同名称的任务添加到队列,则操作将失败。后   从队列中删除任务,您无法插入任务   在10天过后,将其命名为队列。任务名称即可   包含大写和小写字母,数字,下划线和   连字符。任务名称的最大长度为500个字符。

您有两个选择:

  • 确保您分配的任务名称是唯一的 - 例如(假设基于时间戳的名称确实是唯一的):

    def testTaskAddedToQueue(self):
        import time
        task_name = 'my_task_%d' % int(time.time() * 100000)
        taskqueue.Task(name=task_name, url='/url/of/my/task/').add(QUEUE_NAME)
        tasks = self.taskqueue_stub.get_filtered_tasks(QUEUE_NAME)
        assert len(tasks) == 1
        assert tasks[0].name == task_name
    
  • 保留GAE自动分配任务名称(保证唯一 - 基于已排队任务的数量)并从创建的任务中获取名称(而不是声明名称与指定的名称匹配)。例如:

    def testTaskAddedToQueue(self):
        task = taskqueue.Task(url='/url/of/my/task/')
        task.add(QUEUE_NAME)            
        tasks = self.taskqueue_stub.get_filtered_tasks(QUEUE_NAME)
        assert len(tasks) == 1
        assert tasks[0].name == task.name
    

命名冲突阻止将任务添加到队列中,这就是len(tasks) 0.get_filtered_tasks()返回[]的原因。