我正在努力获得在这个特定行动中开始行动的工作。
让我解释一下。
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_job
或go_for_it
作业。
答案 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