0

我有一個rails應用程序,我希望在一天的特定時間使用delayed_jobs gem在後臺進程中發送文本/電子郵件。這是我有我的應用程序的相關部分設置現在:延遲作業總是立即執行

class SomeClass 

    after_create :send_reminder 

    def when_to_run 
    self.date_time - 1.hour 
    end 

    def send_reminder 
    MessageHandler.new().send_message 
    end 

    handle_asynchronously :send_reminder, run_at: Proc.new { |i| i.when_to_run }, queue: "Messages" 

end 

MessageHandler的類是一個單獨的類我定義這實際上容納用於發送短信(含Twilio)和電子郵件的方式(用Mailgun)。

開始的delayed_job(BIN/delayed_job的開始),並創建SomeClass的實例後,delayed_job的日誌內容如下:

Job SomeClass#send_reminder_without_delay (id=686) RUNNING 

我不知道爲什麼它正在運行send_reminder_without_delay,和它做它的每一個時間。我試過在send_reminder方法中使用MessageHandler.new().delay.send_message而不是MessageHandler.new().send_message,但是這在我的任何地方都沒有得到。

我已經搜索了高和低的答案,並繼續縮短 - 任何幫助將不勝感激!

回答

0

我認爲你的問題在run_at: Proc.new { |i| i.when_to_run }

我不完全確定date_time方法是做什麼的,但是您是否檢查過它是否實際返回的時間超過1小時?

否則,run_At將在過去收到時間並運行該方法。

如果DATE_TIME的返回值是與此類似:

def when_to_run 
    Time.now - 1.hour 
    end 

然後你開始延遲工作隊列會立即運行。

檢查您的run_at時間是否將來。

0

我們使用Rails 4.2並設置了隊列適配器。我們需要在我們的配置中使用此行:

config.active_job.queue_adapter = :delayed_job