我正在使用节点芹菜。 我只需要实现调度任务,以便任务可以在特定时间在后台运行。 我很困惑如何定义我的任务,目前我在实现节点芹菜的同一文件中定义任务。
const celery = require('node-celery');
let client = celery.createClient({
CELERY_BROKER_URL: 'amqp://guest:guest@localhost:5672//',
CELERY_RESULT_BACKEND: 'amqp://'
});
在上面的代码中,我只需要节点芹菜,然后为 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 文件中导入它们?
您可以从小处着手,使用 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)
})
TL;博士
这是一个 python 函数.
有关更多信息,请参阅文档
详
这里的术语有点令人困惑,所以我会尝试清除它:
你的 celery 客户端实际上正在连接到代理(即任务队列(。 代理将收到一条消息,其中包含您希望运行的函数名称和参数。 芹菜工作器是一个 python 进程,它从代理中提取消息,然后执行您请求的功能。
send_batch_email_using_mailgun
的实施只需要芹菜工人知道。