【问题标题】:how to use celery beat with node-celery如何使用 celery beat 和 node-celery
【发布时间】:2017-08-07 11:34:50
【问题描述】:

我正在使用 node-celery github link 来实现 celery celery first step 和 rabbitmq。

就像在 celery 中一样,我们定义任务然后推送它们。

我在 tasks.py 中定义的任务如下:

import os
import logging
from celery import Celery
import requests

backend = os.getenv('CELERY_BACKEND_URL', 'amqp')
celery = Celery('tasks', backend=backend)

celery.conf.update(
    CELERY_RESULT_SERIALIZER='json',
    CELERY_ENABLE_UTC=True
)

@celery.task
def getOrders():
    requests.get('locahost:4000/getOrders')

我为触发任务而运行的文件:

eta.js:

  var celery = require('../celery'),
        client = celery.createClient({
            CELERY_BROKER_URL: 'amqp://guest:guest@localhost:5672//'
     });
    
    
    
    client.on('error', function(err) {
        console.log(err);
    });
    
    client.on('connect', function() {
        client.call('tasks.getOrders', {
            eta: new Date(Date.now() + 15 * 1000) // an hour later
        });
    });

我使用以下命令启动 celery worker:

celery worker -A tasks -l info

现在,当我运行 eta.js 并且我在 tasks.py 中定义的任务“getOrders”获得触发器并且它进一步点击我请求的 url 并且该 URL 起作用。

要运行 eta.js,我运行:

 node eta.js

我想要的是我的任务“getOrders”在每 x 秒后继续运行。 我已经阅读了关于在 celery periodic tasks celery 中设置周期性任务的信息,但它在 python 中,我在 node-celery 中需要它。

如果可能的话,我想在 node-celery 中使用 celery beat,还是应该避免使用 node celery?并使用 celery python setup,我知道 python 但找不到任何在 python 中设置 celery 的链接。

任何对芹菜有很好了解的人都可以帮助我或指导我学习一些教程。

谢谢!

【问题讨论】:

  • 对此的任何更新。我也需要一个类似的系统。你有没有想过如何做到这一点。
  • @shubham003,请查看以下 Emilio Camacho 的回答。

标签: rabbitmq celery celerybeat node-celery


【解决方案1】:

您可以直接将计划任务添加到 Redis,这样 Redbeat 就会读取这个新任务并执行它并根据 crontab 设置重新安排它。

为此:

  1. 在你的 celery 配置中添加 redbead redis url
  2. 创建周期性任务
const task = {
     name : "getOrdersTask",
     task : "tasks.getOrders",
     schedule: {
         "__type__": "crontab",
         minute : "*/5",
         hour : "*",
         day_of_week :
         day_of_month : "*/7"
         month_of_year : "[1-12]"
     },
     args : [],
     enabled : true,
}
  1. 将任务存储在redis中:

    redisClient.hset("redbeat:getOrdersTask", "definition", JSON.stringify(task));
    
  2. 将任务插入任务列表(0 是强制 Redbeat 立即执行它,以便根据您选择的时间段配置在适当的时间重新安排它,在这种情况下每 5 分钟一次)

    redisClient.zadd("redbeat::schedule", 0, "getOrdersTask")
    

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 2015-06-04
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2015-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多