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

Get job id on called method from 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的第二次不同调用。它本身又被延迟了。

这里我需要知道的是 go_for_it 方法中哪个作业调用 runinvoke_job

如果我理解得很好,你需要知道 运行。

您可以使用带有 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