2016-07-25 10 views
0

Ich versuche, einen Job 3 Minuten nach einer Aktion des Controllers auszuführen.Job in X Minuten starten

Ich habe versucht, dies mit DelayedJob:

# in my controller 

def index 
    @books = Book.all 
    Delayed::Job.enqueue(ReminderJob.new(params[:user_id])) 
end 

Und in der ReminderJob.rb Datei:

class ReminderJob < Struct.new(:user_id) 
    def perform 
    p "run reminder job" 
    # do something 
    end 
    handle_asynchronously :perform, :run_at => Proc.new { 3.minutes.from_now } 
end 

Wenn jedoch die Index-Seite zugreifen, die ich in den Protokollen etwas nicht sehen, und 3 Minuten später passiert nichts.

Was habe ich falsch gemacht? Gibt es eine andere empfohlene Möglichkeit, eine Aufgabe "in X Minuten von jetzt an" auszuführen, ohne sleep zu verwenden?

+0

Haben Sie lesen [Common-Probleme # Nichts-passiert] (https://github.com/ collectividea/delayed_job/wiki/Häufig auftretende Probleme # nothing-happens)? –

+0

Warum verwenden Sie nicht den integrierten 'ActiveJob' von Rails? – siegy22

+0

@RaVeN Ich konnte mit activeJob keine Möglichkeit finden, "diesen Job in X Minuten zu starten". Ist das möglich ? –

Antwort

1

In diesem würde ich wirklich Rails 'eingebaute Komponente namens ActiveJob verwenden. Siehe here wie Setup und grundlegende Verwendung.

In Ihrem Fall dieser Code funktionieren würde:

def index 
    user = User.find(params[:user_id]) 
    ReminderJob.set(wait: 3.minutes).perform_later(user) 
end 

und Ihre Aufgabe:

class ReminderJob < ApplicationJob # or use ActiveJob::Base 
    def perform(user) 
    # do something with the user 
    end 
end 
Verwandte Themen