Как определить задачу в ноде-сельдерее?

Я использую нод-сельдерей. Мне просто нужно реализовать задачу планирования, чтобы она могла работать в фоновом режиме в определенное время. Я запутался, как я могу определить свою задачу, в настоящее время я определяю задачу в том же файле, где я реализую нод-сельдерей.

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?

1 ответ

Вы можете начать с малого и использовать api setInterval() для выполнения запланированного задания.

Допустим, ваша задача - отправить электронное письмо всем пользователям.

Определите это в такой функции:

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

Проверьте его, если он работает, вызвав func, но просто включив его и запустив сервер один раз:

sendScheduledEmails() 

Когда вы видите, что ваша функция работает, используйте API:

setInterval(sendScheduledEmails, 120000)

Check if your app is doing the task within the intervals. Once you see it's working, you can look into other modules and further tweak it.

If you want to take action after something happens. Let's say you want to send email after a user is registered.

Then when the user registers, you can emit an event like this:

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;DR

это функция Python.
для получения дополнительной информации см. документы

Детали

жаргон здесь немного сбивает с толку, поэтому я попытаюсь прояснить его:
ваш клиент сельдерея фактически подключается к брокеру (который является очередью задач). Брокер получит сообщение с именем функции и параметрами, которые вы хотите запустить. Рабочий сельдерея - это процесс Python, который получает сообщения от брокера, а затем выполняет запрошенную функцию.

Реализация send_batch_email_using_mailgun нужно только знать работнику сельдерея.

Другие вопросы по тегам