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.

Мне очень жаль, если мои предложения выше были путаными.

Вернуться на верх