Получено незарегистрированное задание типа KeyError на производстве - PullRequest
1 голос
/ 09 июля 2019

У меня Сельдерей периодических заданий, которые выполняют какую-то работу и после этого отправляют мне электронное письмо.

Отлично работает на локальном компьютере, но не работает на DO сервере Ubuntu с ошибкой:
Received unregistered task of type KeyError('periodic_tasks.send_email_task',).

My period_tasks.py файл выглядит так:

app = Celery('periodic_tasks', broker='')
logger = get_task_logger(__name__)

@app.task(soft_time_limit=2000, max_retries=2)
def send_email_task(task_db_id):
    db = DBMethods()
    client_listings = dw.generate_client_listings(db)
    current_task = db.get_scheduled_task_data(task_db_id)
    query = current_task.get('task_params').get('query')
    days_stay = current_task.get('task_params').get('days_stay')
    proxy = current_task.get('task_params').get('proxy')
    adults_count = int(current_task.get('task_params').get('adults_count'))
    pets_count = int(current_task.get('task_params').get('pets_count'))
    to_email = current_task.get('task_params').get('to_email')
    cc_email = current_task.get('task_params').get('cc_email')
    additional_text = current_task.get('task_params').get('additional_text')

    task_id = str(send_email_task.request.id),
    task_data = {
        "task_id": task_id,
        "task_name": "send_email_task",
        "task_args": [client_listings, query, proxy, days_stay, adults_count, pets_count,
                                 to_email, cc_email, additional_text],
        "task_start_at": datetime.now(),
        "task_status": 0
    }
    db.start_scheduled_task(task_data)

    try:
        logger.info(email_worker_new(db, client_listings, query, proxy, days_stay, adults_count, pets_count,
                                 to_email, cc_email, additional_text))

        db.finish_scheduled_task(task_id, 1, datetime.now(), 'success')
    except SoftTimeLimitExceeded:
        db.finish_scheduled_task(task_id, 9, datetime.now(), 'timeout')

app.conf.beat_schedule = {
    "send-email-001-task": {
        "task": "periodic_tasks.send_email_task",
        "schedule": crontab(minute="0", hour="*/2"),
        "args": ('email_001', )
    },
}

Запустите celery с командой - celery -A periodic_tasks worker -B --loglevel=info в supervisord

Пожалуйста, помогите мне.Что я делаю не так на производстве?

1 Ответ

1 голос
/ 10 июля 2019

Это типичная «проблема».

- Вам необходимо повторно развернуть последний код на всех машинах, на которых работают сотрудники Celery, чтобы у них были зарегистрированы новые задачи.

Вам нужна хорошая стратегия развертывания. Самая простая вещь, которую вы можете сделать, это собрать колесо Python со всеми пакетами заданий Celery и выполнить pip install -U your-project на всех машинах, на которых работает Celery. Естественно, вам также нужно перезапустить Celery ...

Как только ваш новый код появится и ваши работники в Celery запущены, вы можете проверить, зарегистрирована ли ваша новая задача, запустив celery -A periodic_tasks inspect registered. Вы должны увидеть ваши новые задачи в этом списке.

...