受Beguene回答的启发,并对Rails 5 ActiveJob代码进行了一些反向工程,我已经使其适用于Rails 4.2,具体步骤如下:
1) 在lib/active_job/queue_adapters/delayed_job_adapter.rb
或 config/initializers/delayed_job.rb
(两个位置都可行)中添加以下代码:
module ActiveJob
module Core
attr_accessor :provider_job_id
end
module QueueAdapters
class DelayedJobAdapter
class << self
def enqueue(job)
delayed_job = Delayed::Job.enqueue(JobWrapper.new(job.serialize), queue: job.queue_name)
job.provider_job_id = delayed_job.id
delayed_job
end
def enqueue_at(job, timestamp)
delayed_job = Delayed::Job.enqueue(JobWrapper.new(job.serialize), queue: job.queue_name, run_at: Time.at(timestamp))
job.provider_job_id = delayed_job.id
delayed_job
end
end
class JobWrapper
attr_accessor :job_data
def initialize(job_data)
@job_data = job_data
end
def perform
Base.execute(job_data)
end
end
end
end
end
attr_accessor :provider_job_id
语句在Rails 4.2中是必需的,因为它在enqueue方法中使用,而在4.2中尚未定义。
然后我们可以按照以下方式使用它:
2)定义我们自己的ActiveJob类:
class MyJob < ActiveJob::Base
queue_as :default
def perform(object, performmethod = method(:method))
returnvalue = object.send(performmethod)
returnvalue
end
end
end
3) 现在我们可以在代码的任何地方创建一个新的任务:
job = MyJob.perform_later(Myobject, "mymethod")
这将把方法
Myobject.mymethod
放入队列中。
4) 1)中的代码帮助我们找到与我们的工作相关联的延迟作业:
delayed_job = Delayed::Job.find(job.provider_job_id)
5) 最后,我们可以对 delayed_job 进行任何需要的操作,例如删除它:
delayed_job.delete
注意:在Rails 5中,步骤1)将不再需要,因为完全相同的代码已经成为Rails 5的一个组成部分。