Celery beat отправляет запланированное задание только один раз, а затем не отправляет задание при перезапуске
Я использую Celery beat для выполнения задачи, которая должна выполняться в определенное время. Я пытался вычислить ее сейчас, изменив время, чтобы проверить, правильно ли она работает. Я заметил, что он правильно отправляет задание, когда я запускаю свежую команду celery -A jgs beat -l INFO, но затем, если я изменю время в разделе расписания с двух минут на три минуты, а затем снова запущу вышеупомянутую команду, beat не отправит задание. Затем я заметил кое-что странное. Если я перейду в область администратора и удалю все другие старые задания, которые были созданы в таблице crontab, а затем снова выполню команду, она снова отправит задание на рабочий сервер.
Задачи отслеживаются рабочим правильно, а также правильно работает celery worker. Ниже приведены коды, которые я написал для выполнения задания.
celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
from celery.schedules import crontab
from django.utils import timezone
from datetime import timezone
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jgs.settings')
app = Celery('jgs')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.conf.enable_utc = False
app.conf.update(timezone = 'Asia/Kolkata')
# app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
# CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])
app.config_from_object('django.conf:settings', namespace='CELERY')
# Celery beat settings
app.conf.beat_schedule = {
'send-expiry-email-everyday': {
'task': 'control.tasks.send_expiry_mail',
'schedule': crontab(hour=1, minute=5),
}
}
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
control/tasks.py
from celery import shared_task
from django.core.mail import message, send_mail, EmailMessage
from django.conf import settings
from django.template.loader import render_to_string
from datetime import datetime, timedelta
from account.models import CustomUser
from home.models import Contract
@shared_task
def send_expiry_mail():
template = render_to_string('expiry_email.html')
email = EmailMessage(
'Registration Successfull', #subject
template, # body
settings.EMAIL_HOST_USER,
['emaiid@gmail.com'], # sender email
)
email.fail_silently = False
email.content_subtype = 'html' # WITHOUT THIS THE HTML WILL GET RENDERED AS PLAIN TEXT
email.send()
return "Done"
settings.py
############# CELERY SETTINGS #######################
CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
# CELERY_BROKER_URL = os.environ['REDIS_URL']
CELERY_ACCEPT_CONTENT =['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Kolkata'
CELERY_RESULT_BACKEND = 'django-db'
# CELERY BEAT CONFIGURATIONS
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
команды, которые я использую для рабочего
celery -A jgs.celery worker --pool=solo -l info
для удара
celery -A jgs beat -l INFO
Пожалуйста, поправьте меня, где я иду неправильно или что я пишу неправильно, я полностью в начинающей фазе в этой части async.
Мне очень жаль, если мои предложения выше были путаными.