2017-04-19 2 views
3

Ich mache eine Wetter-API, die Daten von einer anderen API erhalten, verarbeiten und speichern wird. Um die täglichen Updates zu erhalten (URL-Informationen anfragen, JSON/XML-Daten abrufen, meine Daten erstellen und in meiner Datenbank speichern) halte ich die Verwendung eines ActiveJobs für den geeignetsten Weg.Planen Sie einen ActiveJob in Rails

Ich möchte den Job so planen, dass er regelmäßig ausgeführt wird. Ich möchte etwas wie UNIX Cron oder Spring @ Scheduled Annotation für Java.

Ich habe eine andere Fragen zu Stack Overflow (this one) über die Planung von Jobs gesehen, aber sie verwenden externe Edelsteine ​​wie immer. Ich habe nach einem Backend gesucht, das es ermöglicht, den Job in der Rails API (Backends) auszuführen, aber es scheint, dass keiner der verfügbaren Jobs einen Job planen kann.

Gibt es irgendetwas im Rails-Framework (Version 5), das mir erlaubt, das zu tun, was ich versuche? Oder muss ich ein externes Juwel benutzen?

Vielen Dank.

bearbeiten Wenn für jedermann, hier nützlich ist das Schema für den Job ist:

class ImportDailyDataJob < ApplicationJob 
    queue_as :default 

    def perform(*args) 
    # Do something later 
    end 

    private 

    def prepare_request 
    # return the request object 
    end 

    def request_data 
    # Get the data from external API. 
    end 

    def process_data 
    # Process the data 
    end 

    def save_processed_data 
    # Saves the data to the database 
    end 
end 
+0

Up gewählt, weil eine Schiene nur so wäre, wäre schön. Persönlich habe ich Cron-Jobs verwendet, um Rails-Skripte auszuführen. –

+0

Nur um etwas über externe Edelsteine ​​vs ActiveJob zu klären: AJ bietet eine _common Schnittstelle _ zu verschiedenen Warteschlangenadaptern, die es so machen, dass der gleiche Code, sagen wir, Resque, leicht umgeschaltet werden kann, um Sidekiq zu sagen. Sie profitieren nicht wirklich von AJ _without_ mit einem Werkzeug außerhalb der Schienen Kern, jedoch. – Glyoko

Antwort

1

Diese nicht wirklich Scheduling ist, aber Sie fälschen es in bestimmten Situationen können, wenn Sie die Zeitplanung nicht brauchen völlig korrekt, also in Ihrem Fall führen Sie den Job einmal täglich zu sein:

class WeatherJob < ApplicationJob 
    def perform 
    reschedule_job 

    do_work 
    end 

    def do_work 
    # ... 
    end 

    def reschedule_job 
    self.class.set(wait: 24.hours).perform_later 
    end 
end 

Einreihen Jobs, die in Zukunft mit ActiveJob ausgeführt werden, sollten mit DelayedJob oder Sidekiq funktionieren, werden möglicherweise nicht in allen aktiven Job-Backends unterstützt?

+0

Schöne Annäherung! Ihre Herangehensweise erlaubt es mir, den Job einmal am Tag auszuführen, ohne ein externes Juwel zu benutzen, aber wie kann ich es am Anfang ausführen? – F404

+0

nur Enqueue es das erste Mal von Rails Konsole 'Bündel exec Rails Konsole' - 'WeatherJob.perform_later' wird dazu führen, dass es sofort ausgeführt wird, die den Datensatz in die Warteschlange einreihen wird, um 24 Stunden später wieder zu laufen – house9

1

Ich glaube, Sie für sidekiq gehen sollteredis mit schreiben, eine Aufgabe, einen Job zu planen, zu tun so dass nur diese beiden Juwelen installieren und für ihre Dokumentation gehen:

gem 'redis-rails' 

dann installieren sidekiq

gem 'sidekiq' 
+0

Vielen Dank für Ihre Antwort. Wie beide Antworten bestätigt haben, gibt es keinen integrierten Scheduler auf Rails. – F404

+0

Nein, es ist nicht so, dass ActiveJob Ihnen jedes bisschen redis und sidekiq bietet, aber es ist der Kern von Rails, dass Sie zuerst durch die Dokumentation gehen müssen, dann werden Sie in der Lage sein damit umzugehen, aber redis und sidekiq werden Ihnen viel besser geben Verständnis dafür auch mit ui. –

1

Die meisten der wichtigsten AJ-Adapter verfügen über einige Funktionen zum Planen von Jobs, aber einige haben diese Funktionalität in separate Edelsteine ​​unterteilt. Für Resque zum Beispiel gibt es eine separate resque-scheduler Edelstein, die neben der Vanille Resque Juwel für genau dies funktioniert.

Und here's das Bit über wiederkehrende Jobs. Nach einigen grundlegenden Einstellungen erstellen Sie eine schedule.yml-Datei, die definiert, wie/wann der Job ausgeführt werden soll, z.

Ich weiß nicht über jeden Adapter, aber die wichtigsten haben in der Regel ähnliche Schwester Edelsteine, die diese Funktionalität bieten.

+0

Um klar zu sein, obwohl dies Cron-Syntax verwendet, geht es nicht durch Cron. Es funktioniert vollständig innerhalb von Redis/Resque. – Glyoko

+0

Danke für die Erklärung und die Links. Ich muss untersuchen, welche Rolle Redis im Job-Scheduler-Prozess spielt, da beide Antworten die Verwendung von externem Edelstein + Redis vorgeschlagen haben. Aber das wird ein gutes Thema für eine andere Frage sein. Wie auch immer, ich benutze wahrscheinlich Resque. – F404

Verwandte Themen