受 Beguene 的回答和 Rails 5 ActiveJob 代码的一些逆向工程的启发,我已将其与 Rails 4.2 一起使用
1) 在lib/active_job/queue_adapters/delayed_job_adapter.rb 或config/initializers/delayed_job.rb 中添加以下代码(两个位置都有效):
# file: lib/active_job/queue_adapters/delayed_job_adapter.rb
module ActiveJob
module Core
# ID optionally provided by adapter
attr_accessor :provider_job_id
end
module QueueAdapters
class DelayedJobAdapter
class << self
def enqueue(job) #:nodoc:
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) #:nodoc:
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 #:nodoc:
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 类:
# file: app/jobs/my_job.rb
class MyJob < ActiveJob::Base
queue_as :default
def perform(object, performmethod = method(:method))
# Do something later
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) 最后,我们可以做任何我们需要对 delay_job 做的事情,例如删除它:
delayed_job.delete
注意:在 Rails 5 中,步骤 1) 将不再需要,因为完全相同的代码是 Rails 5 的组成部分。