Delayed::ClassName Plugin

Delayed Job records a serialized payload object to the delayed_jobs table. If you want to know what kinds of jobs are currently enqueued, you must write complicated and brittle queries to parse the serialized payloads (ie Delayed::Job#handler).

This plugin adds an indexed class_name column to the delayed_jobs table. By default, it contains the stringified class name of the enqeued payload object.

Installation

Add this line to your application's Gemfile:

gem 'delayed_job_class_name_plugin'

And then execute:

$ bundle

Or install it yourself as:

$ gem install delayed_job_class_name_plugin

Run the required database migrations:

$ rails generate delayed_job_class_name_plugin:install
$ rails db:migrate

Usage

In certain cases, you may want to parse the payload object in a custom way to derive its "class name."

For example, ActiveJob in Rails, will always enqueue a JobWrapper as the payload object. This object, predictably, wraps the object that's actually doing work. By default, "JobWrapper" would be the value of Delayed::Job#class_name. You may find this less helpful than having #class_name contain the class of the wrapped object.

Let's see how we can use the #custom_parser configuration to accomplish this:

# config/initializers/delayed_job.rb
Delayed::ClassName.configure do |c|
  c.custom_parser = ->(job) {
    if job.class == ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper
      job.payload_object.job_data['job_class']
    else
      job.payload_object.class.name
    end
  }
end

Configuration#custom_parser can take a Proc which receives a single parameter, job, and returns a String that will be written to Delayed::Job#class_name at enqueue-time.

License

The gem is available as open source under the terms of the MIT License.