【发布时间】:2015-04-18 08:13:31
【问题描述】:
我使用 Rails 4.2 和 delayed_job 4.0.6 作为我的 ActiveJob 后端。
我有一份工作,我只想在队列中允许一次。有问题的作业需要一分钟多的时间才能运行。它由模型上的回调排队。回调将比作业完成的频率高得多。该作业无需在未来多次排队。
这是我想要完成的一些伪代码。
# app/jobs/refresh_account_cache_job.rb
class RefreshAccountCacheJob < ActiveJob::Base
def before_enqueue
skip if job_already_enqueued
end
def perform
Account.write_to_cache
end
def job_already_enqueued
# ?
end
end
如果作业的实例在再次调用时正在运行,它仍应排队等待将来。我正在寻找一种方法让该作业排队等待未来最多运行 1 次。
我认为答案必须特定于delayed_job,但如果它可以推广到ActiveJob,那就更好了。
【问题讨论】:
-
可以用redis吗?比如,你的堆栈上安装了吗?
-
我需要在这个项目上坚持使用 Postgres。
-
不是要求你替换它,但是如果你可以将redis和Postgres一起使用,可以有一个简单的解决方案。
-
如果你在考虑 Resque 或 Sidekiq,我不能走这两条路。
-
不.. 保持一切不变,只需将 redis 添加到堆栈中,这样您就可以对其进行简单的获取/设置。
标签: ruby-on-rails delayed-job rails-activejob