July 18, 2016
This blog is part of our Rails 5 series.
Rails 4.2 came with built-in support for executing jobs in the background using Active Job. Along with many enhancements to Active Job, Rails 5 provides the ability to attach arbitrary metadata to any job.
Consider the scenario where we would like to get notified when a job has failed
for more than three times. With the new enhancement, we can make it work by
overriding serialize
and deserialize
methods of the job class.
class DeliverWebhookJob < ActiveJob::Base
def serialize
super.merge('attempt_number' => (@attempt_number || 0) + 1)
end
def deserialize(job_data)
super(job_data)
@attempt_number = job_data['attempt_number']
end
rescue_from(TimeoutError) do |ex|
notify_job_tried_x_times(@attempt_number) if @attempt_number == 3
retry_job(wait: 10)
end
end
Earlier, deserialization was performed by #deserialize class method and therefore was inaccessible from the job instance. With the new changes, deserialization is delegated to the deserialize method on job instance thereby allowing it to attach arbitrary metadata when it gets serialized and read it back when it gets performed.
If this blog was helpful, check out our full blog archive.