延迟作业总是立即执行

时间:2015-05-28 21:49:00

标签: ruby-on-rails ruby ruby-on-rails-4 background-process delayed-job

我有一个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 start)并创建SomeClass实例后,delayed_job日志内容如下:

 Job SomeClass#send_reminder_without_delay (id=686) RUNNING

我不确定它为什么运行send_reminder_without_delay,而且每次都在执行它。我尝试在MessageHandler.new().delay.send_message方法中使用send_reminder而不是MessageHandler.new().send_message,但这也没有让我到处找。

我已经搜索过高低的答案并且不断提出 - 任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

我认为您的问题出在t

我不完全确定date_time方法的作用,但是你确定它是否实际返回的时间超过1小时?

否则run_At将在过去收到一个时间并运行该方法。

如果date_time的返回值与此类似:

run_at: Proc.new { |i| i.when_to_run }

然后,一旦你开始延迟工作,队列就会运行。

检查您的run_at时间是否为将来。

答案 1 :(得分:0)

我们使用Rails 4.2并设置队列适配器。我们需要在配置中使用这一行:

config.active_job.queue_adapter = :delayed_job