Ispirato alla risposta di Beguené e qualche rovescio engineering del codice ActiveJob Rails 5, ho fatto lavorare con Rails 4.2 da
1) aggiungendo seguente codice nel lib/active_job/queue_adapters/delayed_job_adapter.rb
o config/initializers/delayed_job.rb
(entrambe le posizioni hanno lavorato):
# 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
La dichiarazione attr_accessor :provider_job_id
è necessario in Rails 4.2, poiché è utilizzato nel metodo di accodamento e non è ancora definito in 4.2.
Poi possiamo fare uso di esso come segue:
2) definire la nostra propria classe 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) Ora possiamo creare un nuovo lavoro in qualsiasi parte del codice:
job = MyJob.perform_later(Myobject, "mymethod")
Inserirà il metodo Myobject.mymethod
nella coda.
4) Il codice in 1) ci aiuta a trovare il lavoro in ritardo che è associato con il nostro lavoro:
delayed_job = Delayed::Job.find(job.provider_job_id)
5), infine, si può fare, tutto ciò che dobbiamo fare con il delayed_job, per esempioeliminarlo:
delayed_job.delete
Nota: in Rails 5, punto 1) non sarà più necessario, dal momento che lo stesso codice esatto è parte integrante di Rails 5.
Ah, ma poi alcuni potrebbero sostenere che la necessità di ottenere l'id del lavoro è "tutti i tipi di hacky" anche! Per curiosità e perché potrebbe aprire la porta a un approccio alternativo, perché hai bisogno del posto di lavoro? – Shadwell
È per la possibilità di annullare i report prima che vengano eseguiti mentre sono in coda. – kddeisz