Active Job Γ¨ un framework per dichiarare dei job e farli andare in background; tutto quello che puΓ² essere diviso in piccole unitΓ di lavoro da far eseguire in differita rispetto allβutente, puΓ² essere fatto con gli Active Job. ActiveJob Γ¨ un framework che sta sopra gli effettivi motori che fanno partire i job, come Delayed Job e Resque in modo da non dover preoccuparsi della differenza tra le varie possibilitΓ .
Creare un job
Active Job fornisce un generatore per creare i job:
$ bin/rails generate job guests_cleanup
create app/jobs/guests_cleanup_job.rb
Posso creare un job che viene lanciato su una specirfica coda:
$ bin/rails generate job guests_cleanup --queue urgent
Mettere in coda un job
Il job viene eseguito appena la coda Γ¨ libera
MyJob.perform_later record
Il job verrΓ eseguito domani a mezzogiorno
MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record)
Il job verrΓ eseguito fra una settimana
MyJob.set(wait: 1.week).perform_later(record)
Backend per gestire le code di processi
Esistono vari gestori di job in coda (Sidekiq, Resque, Delayed Jobβ¦) per utilizzarli, dopo averne installato la gem, basta andare nelle configurazioni
module YourApp
class Application < Rails::Application
config.active_job.queue_adapter = :sidekiq
end
end
Code
Molti gestori permettono multiple code e posso assegnare che un job sia su una specifica coda:
class GuestsCleanupJob < ActiveJob::Base
queue_as :low_priority
#....
end
Eβ possibile inserire una stringa che sia un prefisso al nome di tutte le code:
class Application < Rails::Application
config.active_job.queue_name_prefix = Rails.env
end
Ora quindi con il comando queue_as :low_priority
metterΓ il job nella coda production_low_priority
in produzione e staging_low_priority
in staging.
Posso passare anche un block al comando queue_as, come nel seguente esempio:
queue_as do
video = self.arguments.first
if video.owner.premium?
:premium_videojobs
else
:videojobs
end
end
Ovviamente poi Γ¨ necessario configurare coloro che lanciano i job perchΓ¨ βascoltinoβ le code con il nome corretto.
Callback
Posso lanciare delle callback mentre il job sta per essere lanciato, le callback disponibili sono:
before_enqueue
around_enqueue
after_enqueue
before_perform
around_perform
after_perform
Exceptions
ActiveJob fornisce un modo comodo per gestire le eccezioni che si possono verificare durante il lancio del job:
class GuestsCleanupJob < ActiveJob::Base
queue_as :default
rescue_from(ActiveRecord::RecordNotFound) do |exception|
end
def perform
end
end