我正在使用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文件中?
答案 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)
具有python函数。
有关更多信息,请参见docs
这里的术语有点混乱,所以我会尝试清除它:
您的celery客户实际上正在连接到代理(即任务队列)。
代理将收到一条消息,其中包含您要运行的函数名称和参数。
celery worker是一个python进程,它从代理中提取消息,然后执行您请求的功能。
send_batch_email_using_mailgun
的实现只需要芹菜工作者知道。