2016-07-05 15 views
0

In einem Controller habe ich eine Postanforderung von einem authentifizierten Benutzer, der einen ActiveJob auslöst.Warteschlange in Delayed_Job mit ActiveJobs

RunReportsJob.perform_later(param1, param2, param3) 

Es funktioniert ohne Fehler. Wenn der Benutzer jedoch die Schaltfläche (Abschiebeanforderung) erneut drückt, um RunReportsJob auszulösen, während er bereits ausgeführt wurde, werden gleichzeitig zwei Jobs ausgeführt. Ich habe delayed_job eingerichtet, weil ich dachte, es wäre ein Warteschlangen-Service, und würde alles auf einmal erledigen. Aber das passiert nicht. Im Folgenden finden Sie meine Konfiguration:

# app/jobs/run_reports_job.rb:

class RunReportsJob < ActiveJob::Base 
     queue_as :RunReports 
     include ShopifyApp::Controller 
     # -------------------------------------------------------------- 
     # JOB ERROR MANAGEMENT 
     # -------------------------------------------------------------- 
     rescue_from(ActiveRecord::RecordNotFound) do |exception| 
      # Do something with the exception 
      logger.debug "Hit rescue_from" 
     end 
     # -------------------------------------------------------------- 
     # JOB FUNCTION 
     # -------------------------------------------------------------- 
     def perform(param1, param2, param3) 
     # some code is performed here 
     end 
end 

:

config.active_job.queue_adapter = :delayed_job 

# config/initializers/delayed_job_config.rb:

Delayed::Worker.max_attempts = 1 
Delayed::Worker.max_run_time = 12.hours 

Antwort

1

Sie werden einige Logik vor RunReportsJob.perform_later(param1, param2, param3) hinzufügen müssen für eine bereits zu überprüfen Auftragspriorität y und erhöhen die Prioritätszahl (kleinere Zahl eine höhere Priorität Dokumentation nach) in diesem Beispiel die Warteschlange:

highest_priority = Delayed::Job.where(queue: :RunReports).maximum(:priority) 
Delayed::Worker.default_priority = highest_priority + 1 if highest_priority 

RunReportsJob.perform_later(param1, param2, param3) 

DelayedJob verwendet eine Tabelle der Jobs alle Infos bei https://github.com/collectiveidea/delayed_job#gory-details

+0

Sie in der Dokumentation speichern muss ich die zweiter Job Anruf in die Warteschlange nach dem 1., nicht ein leeres schießen. Es scheint mir, dass der Code, den Sie hier vorgestellt haben, nichts tut, wenn sich bereits etwas in der Warteschlange befindet. –

+0

Vielleicht suche ich das ?: 'Delayed :: Worker.read_ahead = 1'. Wenn der Standardwert 5 ist, bedeutet das, dass der delayed_job versucht, die letzten 5 in seiner Datenbank zur gleichen Zeit verfügbar zu machen? –

+0

oh, ich bekomme es jetzt, dies könnte mit Priorität erreicht werden, werde ich den Antwortcode ändern – neydroid

Verwandte Themen