1

我正在使用node-celery。我只需要实现调度任务,以便任务可以在特定时间在后台运行。我很困惑如何定义我的任务,目前我在实现 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 创建了一个客户端。现在我必须连接客户端,然后 使用一些参数调用我的任务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 文件中?

4

2 回答 2

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)
})
于 2018-10-24T07:35:21.390 回答
0

TL;博士

它是一个python函数。
有关更多信息,请参阅文档

细节

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

send_batch_email_using_mailgun只需要 celery worker 知道它的实现。

于 2020-11-26T09:21:42.040 回答