Inspiriert durch die Antwort von Beguene und einige Rückwärts Engineering des ActiveJob Code Rails 5, ich habe es mit Rails 4.2 von
Zugabe
1) aus arbeitet folgenden Code in lib/active_job/queue_adapters/delayed_job_adapter.rb
oder config/initializers/delayed_job.rb
(beiden Standorte gearbeitet haben):
# 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
Die attr_accessor :provider_job_id
Anweisung in erforderlich Schienen 4.2, da es in der Enqueue-Methode verwendet wird und noch nicht in 4.2 definiert ist.
Dann können wir davon Gebrauch machen möchten folgt:
2) definieren unsere eigene ActiveJob Klasse:
# 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) Jetzt können wir einen neuen Job irgendwo im Code erstellen:
job = MyJob.perform_later(Myobject, "mymethod")
Dadurch wird die Methode Myobject.mymethod
in die Warteschlange gestellt.
4) Der Code in 1) hilft uns, die Verzögerte Job zu finden, die mit unserer Arbeit verbunden ist: schließlich
delayed_job = Delayed::Job.find(job.provider_job_id)
5), was wir tun können, was wir mit dem delayed_job tun müssen, z.B.löschen:
delayed_job.delete
Hinweis: in Rails 5, Schritt 1) wird nicht mehr benötigt werden, da die exakt gleiche Code ist integraler Bestandteil der Schienen 5.
Ah, aber dann, dass einige vielleicht argumentieren zu müssen Holen Sie sich die Job-ID ist "alle Arten von Hacky" auch! Aus Neugier, und weil es die Tür zu einem alternativen Ansatz öffnen könnte, warum brauchen Sie die Job-ID? – Shadwell
Sie können Berichte abbrechen, bevor sie ausgeführt werden, während sie sich in der Warteschlange befinden. – kddeisz