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

问题描述 投票:0回答:1

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

让我解释。

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的第二个不同的调用。它只是自己再次延迟。

我需要知道的是runinvoke_jobgo_for_it方法上的工作。

ruby-on-rails ruby delayed-job
1个回答
0
投票

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

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

示例:

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
© www.soinside.com 2019 - 2024. All rights reserved.