从job获取被调用方法的作业ID

时间:2016-02-18 08:09:14

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

我正在努力获得在这个特定行动中开始行动的工作。

让我解释一下。

class MyClass
  def go_for_it(delay = true)
    if delay
      delay(run_at: 2.minutes.from_now).go_for_it(false)
    else
      # How can I know if I was called by a DelayedJob AND if yes, which one ?
      puts "I'll do it"
    end

  end
end


my_class = MyClass.new
my_class.delay(run_at: 2.minutes.from_now).go_for_it

我的目标是限制创造就业机会。我不希望调用两次go_for_it方法但是这种方法可以根据某些原因再次自行延迟。如果我将这些行添加到go_for_it

calling_method = caller_locations[0].label
job = Delayed::Job.where(queue: "my_queue").first
puts job.payload_object.id
# => id of MyClass if recorded
puts job.payload_object.method_name
# => :go_for_it

如果go_for_it延迟了自己,这些数据是不够的,因为job变量本身就可以,然后它不是got_for_it的第二次不同调用。它本身又被推迟了。

我需要知道的是run方法上的invoke_jobgo_for_it作业。

1 个答案:

答案 0 :(得分:0)

如果我理解得很好,你需要知道哪个工作正在运行。

您可以使用带有前挂钩的自定义作业在运行作业之前执行操作,此时您也可以完全访问作业对象。

示例:

class MyClassJob
  def initialize(my_object: MyClass.new)
    @my_object = my_object
  end

  def before(job)
    binding.pry
    another_job = Delayed::Job.where(queue: "my_queue").where('id <> ?', job.id)
  end

  def perform
    @my_object.go_for_it
  end
end

MyClassJob.new().delay.perform