如何在节点celery中定义任务?

时间:2018-09-04 12:34:38

标签: node.js celery scheduled-tasks node-celery

我正在使用node-celery。 我只需要实现计划任务,以便Task可以在特定时间在后台运行。 我对如何定义任务感到困惑,目前,我正在将实现node-celery的文件定义在同一文件中。

const celery = require('node-celery');
let client = celery.createClient({
                CELERY_BROKER_URL: 'amqp://guest:guest@localhost:5672//',
                CELERY_RESULT_BACKEND: 'amqp://'
            });

在上面的代码中,我只需要node-celery,然后为amqp创建了一个客户端。 现在,我必须连接 client ,然后使用一些参数调用我的任务 send_batch_email_using_mailgun

client.on('connect', function() {
            client.call('send_batch_email_using_mailgun', {
                campaign_data: campaign_data,
                subject: subject,
                template: template
            }, {
                eta: new Date(Date.now() + 120000)
            });
        });

此处 _send_batch_email_using_mailgun _ 是在同一文件中的代码下方使用某些参数定义的任务。 我希望在一段时间后调用我的函数 _send_batch_email_using_mailgun _ 。我的代码无法正常工作,我想我必须在其他地方定义任务功能,但是我不知道在哪里定义它们。 我需要在python文件中创建任务吗?如果是,那如何将它们导入我的js文件中?

2 个答案:

答案 0 :(得分:1)

您可以从小处着手,并使用setInterval()API来执行预定任务。

假设您的任务是向所有用户发送电子邮件。

在这样的函数中定义它:

function sendScheduledEmails() {
  // Get all the emails
  // Send emails with your provider
}

通过调用func来测试它是否有效,而只需放置一次并运行服务器一次即可:

sendScheduledEmails() 

看到函数正在运行时,请使用api:

setInterval(sendScheduledEmails, 120000)

检查您的应用程序是否在间隔内执行任务。一旦看到它正在运行,就可以查看其他模块并对其进行进一步的调整。

如果您想在事情发生后采取行动。假设您要在用户注册后发送电子邮件。

然后,当用户注册时,您可以发出如下事件:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// User registered
// Redirect to success page

myEmitter.emit('userRegistered');

This will fire an event everytime that action happens, and you can listen to it.

Then in your code you can do:

myEmitter.on('userRegistered', function() {
  setInterval(sendScheduledEmails, 120000)
})

答案 1 :(得分:0)

TL; DR

具有python函数。
有关更多信息,请参见docs

详细信息

这里的术语有点混乱,所以我会尝试清除它:
您的celery客户实际上正在连接到代理(即任务队列)。 代理将收到一条消息,其中包含您要运行的函数名称和参数。 celery worker是一个python进程,它从代理中提取消息,然后执行您请求的功能。

send_batch_email_using_mailgun的实现只需要芹菜工作者知道。