2016-11-13 4 views
9

Ich bin eine Website läuft Django 10, RabbitMQ und Sellerie 4 auf CentOS 7.Django Sellerie Admin-Beat-Cron Planen Sie regelmäßige Aufgabe nicht aktualisiert Wirksam

Mein Sellerie Beat- und Sellerie Worker Instanzen werden von Supervisor kontrolliert und Ich benutze den Django Sellerie Datenbank Scheduler.

Ich habe eine Cron-Stil Aufgabe mit dem Cronsheduler in Django-Admin geplant.

Wenn ich Sellerie-Beat- und Worker-Instanzen starte, wird der Job wie erwartet ausgelöst.

Aber wenn eine Änderung der Zeitplan Zeit in Django-Admin dann die Änderungen nicht abgeholt werden, es sei denn ich die Sellerie-Beat-Instanz neu starten.

Gibt es etwas, das ich vermisse oder muss ich meinen eigenen Scheduler schreiben?

Sellerie Beat, mit dem 'django_celery_beat.schedulers.DatabaseScheduler' lädt den Zeitplan aus der Datenbank. Gemäß dem folgenden Dokument https://media.readthedocs.org/pdf/django-celery-beat/latest/django-celery-beat.pdf sollte dies Sellery Beat zum Nachladen zwingen:

Ein Zeitplan, der in einem bestimmten Intervall (z. B. alle 5 Sekunden) ausgeführt wird. • django_celery_beat.models.CrontabSchedule A Zeitplan mit Felder wie Einträge in cron: Minute Stunden-Tag-of-Woche DAY_OF_MONTH month_of_year.

django_cellery_beat.models.PeriodicTasks Dieses Modell wird nur als Index verwendet, um zu verfolgen, wann sich der Zeitplan geändert hat. Immer wenn Sie eine PeriodicTask aktualisieren, wird auch ein Zähler in dieser Tabelle inkrementiert, der den Sellerie-Beat-Service anweist, den Zeitplan von der Datenbank neu zu laden. Wenn Sie periodische Aufgaben in der Masse aktualisieren, müssen Sie den Zähler manuell aktualisieren:

from django_celery_beat.models import PeriodicTasks 
PeriodicTasks.changed() 

Aus dem obigen I des Sellerie Beat-Prozess erwarten würde die Tabelle regelmäßig auf Änderungen zu überprüfen.

+1

möglich duplicate von: http://stackoverflow.com/questions/21666229/sellery-auto-reload-on-any-changes –

+0

Denke nicht, dass es ein Duplikat ist, wie ich Sellerie Beat, um zu erkennen, wenn der Zeitplan hat wurde in der Datenbank aktualisiert. – Steve

+1

Definitiv, kein Duplikat.Die verlinkte Frage redet darüber, Sellerie-Arbeiter neu zu laden, wenn sich Django-Einstellungen ändern (eine statische '.py'-Datei), nicht über 'Sellerie-Beat' und neu zu laden, wenn sich Datenbank-Aufgaben ändern. – Ruben

Antwort

1

Ich habe eine Lösung von:

  1. einen separaten Arbeitsprozess erstellen, die eine RabbitMQ Warteschlange verbraucht.
  2. Wenn Django die Datenbank aktualisiert, wird eine Nachricht an die Warteschlange gesendet, die den Namen des Sellery Beat-Prozesses enthält (der Name wird von der Supervisor-Konfiguration definiert).
  3. Der Worker-Prozess startet dann den genannten Sellerie Beat-Prozess neu.

Ein bisschen langwindig, aber macht den Job. Erleichtert außerdem die Verwaltung mehrerer Django-Apps auf demselben Server, die die gleiche Funktionalität erfordern.

+0

Sie meinen, führen Sie separaten Prozess wie: "Sellerie Beat ..." und "Sellerie Worker ..."? Ich mache das schon und arbeite immer noch nicht. – Ruben

+0

Ja, mit dem Datenbank-Scheduler. Wenn sich die Einstellungen (Zeit usw.) in der Datenbank ändern, müssen Sie den Sellery Beat-Prozess neu starten, damit er die Datenbank erneut liest. – Steve

+1

Wenn Sie Sellerie Beat manuell neu starten müssen, lösen Sie das Problem nicht, oder? "Aber wenn die Zeitplanzeit in Django-admin geändert wird, werden die Änderungen nicht übernommen, es sei denn, ich starte die Sellerie-Beat-Instanz neu." – Ruben

2

ich habe den Sellerie von 4.0 auf 3.1.25, django auf 1.9.11 geändert und djcellery 3.1.17 installiert. Dann noch einmal testen, es ist OK. Also, vielleicht ist es ein Fehler.

Verwandte Themen