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.rbPosso creare un job che viene lanciato su una specirfica coda:
$ bin/rails generate job guests_cleanup --queue urgentMettere in coda un job
Il job viene eseguito appena la coda è libera
MyJob.perform_later recordIl 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
endCode
Molti gestori permettono multiple code e posso assegnare che un job sia su una specifica coda:
class GuestsCleanupJob < ActiveJob::Base
queue_as :low_priority
#....
endE’ 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
endOra 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
endOvviamente 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_enqueuearound_enqueueafter_enqueuebefore_performaround_performafter_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