ruby-on-rails - 如何查明一组 Resque 作业是否已完成?

标签 ruby-on-rails resque jobs

我有以下代码:

[23, 45, 69, 20].each do |page_id|
  Resque.enqueue(ProcessPage, page_id)
end

我想知道所有这些作业何时完成处理以通过电子邮件通知用户。我的第一次尝试是在作业结束时通知用户,但这只能针对每个作业单独进行。

我找到了这颗 gem resque-status ,基本上可以让你这样做:

job_ids = []
[23, 45, 69, 20].each do |page_id|
  job_ids << ProcessPage.create(page_id)
end

然后您可以通过执行以下操作来检查作业的状态:

status = Resque::Plugins::Status::Hash.get(job_id)

令我困惑的是...我应该什么时候检查所有状态?我的意思是,我会花一些时间检查所有工作的状态吗?这会使服务器超时,我有什么想法可以做到这一点吗?

最佳答案

我不会在此处粘贴任何代码,因为看起来您非常熟悉应如何编写作业,但请考虑以下想法:

您应该有一个 resque 作业,它获取要处理的 id 数组。 此 resque 作业为每个 id 创建一个 resque 作业,以便并行处理它们。 在为特定 id 创建 resque 作业后,它将创建另一个 resque 作业,该作业获取 id 列表并定期检查它们以查看它们是否已完成。完成后,此作业将向用户发送一封电子邮件。

通过这个范例,你可以享受所有的世界:

  1. 每个 ID 都有自己的工作。
  2. 并行执行。
  3. 状态检查在后台完成,因此用户不会超时。

更新:

检查resque作业的伪代码:

class CheckerJob
  @queue = :long

  def self.perform(ids)
    finished = []
    while finished.size < ids.size
      ids.each do |id|
        finished << id if job_finished?(id)
      end
      sleep 10
    end
    send_email_to_user
  end
end

现在您要做的就是实现 job_finished?(id)send_email_to_user 方法。

关于ruby-on-rails - 如何查明一组 Resque 作业是否已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501028/

相关文章:

mysql - Rails 控制台 : User will not save - Stack level too deep

ruby-on-rails-3 - Resque worker 的 Heroku 日志

ruby - Dashing 框架未连接到数据库

python - 如何在多个实例中使用prometheus?

windows - 在 Windows 上设置 Resque gem 时,resque-web 命令导致错误

java - 如何使用来自 InterruptableJob 接口(interface)的覆盖中断方法终止当前运行的 quartz 作业?

ruby-on-rails - STI,一个 Controller

ruby-on-rails - 删除多态关联

ruby-on-rails - ActiveRecord 是否已经将手动查询包装到事务中?

ruby-on-rails - Resque - 在多个服务器之间平均分配作业负载