Rails 7.1 Adds after_discard Method To ActiveJob For Discarded Jobs.

ActiveJob is used to enqueue and run the tasks in the background. But a job can fail because of many reasons.

Before

To manage job failures, ActiveJob provides methods like retry_on to reschedule job for re-execution and discard_on to discard the job with no attempts to retry , if the exception is raised.

While these methods provide a way to handle errors and retries, ActiveJob does not provide any method to excute custom logic to handle job failures or to perform cleanup actions after a job is discarded.

class MyJob < ApplicationJob
  discard_on StandardError

  def perform
    raise StandardError, "An error occurred"
  end
end

After

Rails 7.1 adds after_discard method to ActiveJob to run a callback when a job is about to be discarded.

The after_discard callback allows us to define a block of code that runs after a job is discarded.

This callback gives us access to both the job instance and the exception that caused the job to be discarded.

after_discard do |job, exception|
  # add additional logic for error handling.
end
class MyJob < ApplicationJob
  discard_on StandardError

  after_discard :log_discard_info

  def perform
    raise StandardError, "An error occurred"
  end

  private

  def log_discard_info(job, exception)
    Rails.logger.info("Job #{job.class} was discarded due to: #{exception.message}")
    # Additional cleanup logic can be added here
  end
end

after_discard is called in any situation where the job is about to be discarded due to a failure. Those cases are:

  • When exception is raised without retry_on or discard_on.

  • When discard_on is used to handle an exception, with or without a block.

  • When retry_on is used and all retries are exhausted, with or without a block.

  • ActiveJob will run all after_discard blocks even if some of them raise exceptions.

  • Only the last exception raised by the after_discard block will be reported and earlier exceptions are suppressed.

The after_discard method enables us to handle failures more effectively by performing tasks like logging detailed error information, notifying external systems, or executing cleanups.

Need expert help with Rails?

Saeloun is a Rails Foundation Contributing Member helping teams modernize, upgrade, scale, and maintain production Rails applications.

Our Expertise

  • Rails contributors
  • 500+ Technical Articles
  • Production Rails consulting
  • Performance Optimization

Services

  • Rails application development
  • Code Audits
  • Rails upgrades
  • Team Augmentation

Need help on your Ruby on Rails or React project?

Join Our Newsletter