【问题标题】:Delayed_Job: accessing job metadata and/or avoiding duplicate jobsDelayed_Job:访问作业元数据和/或避免重复作业
【发布时间】:2011-10-14 08:30:53
【问题描述】:

我正在尝试在自定义作业类中获取 run_at 日期时间。我的代码如下所示:

class MyCustomJob < Struct.new(:my_object)

  def perform
    if self.run_at == my_object.start_time
      # process the job
    end
  end

end

我也尝试了Delayed::Job.find(self),但没有运气。

提前致谢

【问题讨论】:

  • 你想在 perform 方法中获取 Delayed::Job AR 对象吗?
  • 没错!我需要检查对象的 start_time 是否改变。

标签: ruby-on-rails ruby-on-rails-3 delayed-job


【解决方案1】:

您应该在创建作业时处理此问题:

   priority = 0
   run_time = my_object.start_time
   Delayed::Job.enqueue(MyCustomJob.new(my_object), priority, run_time)

https://github.com/tobi/delayed_job/wiki

如果您的作业没有在预期的时间运行,您可能会为 UTC 安排它们:

http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/

要检查现有作业的队列 - 您可以执行以下操作:


class MyCustomJob < Struct.new(:object_id)

  def self.exists?(object_id)
    Delayed::Job.where(['handler = ? and failed_at is null',handler(object_id)]).count(:all) > 0
  end

  def self.handler(object_id)
    "--- !ruby/struct:MyCustomJob \nobject_id: #{object_id}\n"
  end

  def perform
    my_object = MyObject.find(object_id)
    my_object.do_stuff
  end
end

然后在排队前检查MyCustomJob.exists?(my_object.id)

这有点小技巧 - 根据需要编辑 handler 方法。如果您的作业表很大或者如果您对其他类型的作业执行此操作,我会修改 delay_jobs 表以具有一个 class/object_id 以使代码更简洁和更有效的表扫描。

这个问题看起来也很相关:

How to cancel scheduled job with delayed_job in Rails?

【讨论】:

  • 嗯,我已经像这样排队我的工作了。我需要检查作业运行时对象的 start_time 是否更改。
  • 感谢您的回复!这不是时间问题.. 假设我在日历中有一个事件.. 我想在事件开始前 10 分钟发送提醒.. 所以队列中有一个工作.. 有人将事件更改为第二天..所以我需要检查当前的工作是否仍然有效..
  • 你不能只检查object.start_time > Time.now吗?
  • 我有一个类似的案例 - 在我排队工作之前,我会在表格中搜索任何现有的工作。我会发布一些可能有用的代码。
  • failed_at 仅在所有重试失败时才设置 -- “默认 Worker.max_attempts 为 25。此后,作业要么被删除(默认),要么留在数据库中并设置了“failed_at”。 "
【解决方案2】:

如果您在自定义作业上定义了 before 方法,worker 将在调用 perform 之前将延迟的作业实例传递给您:

class MyCustomTask

  def before(job)
    @job = job
  end

  def perform
    # has access to @job object. 
    # You may need to call @job.reload to see in-flight changes to object in the database.
  end
end

【讨论】:

  • 啊,对不起。错误地投了反对票,现在除非编辑答案,否则我无法撤消它:-(这个答案对我们最有用,也是实际选择的答案。谢谢。
猜你喜欢
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2011-03-19
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多