class Sidekiq::Processor

def dispatch(job_hash, queue, jobstr)

def dispatch(job_hash, queue, jobstr)
  # since middleware can mutate the job hash
  # we need to clone it to report the original
  # job structure to the Web UI
  # or to push back to redis when retrying.
  # To avoid costly and, most of the time, useless cloning here,
  # we pass original String of JSON to respected methods
  # to re-parse it there if we need access to the original, untouched job
  @job_logger.prepare(job_hash) do
    @retrier.global(jobstr, queue) do
      @job_logger.call(job_hash, queue) do
        stats(jobstr, queue) do
          profile(job_hash) do
            # Rails 5 requires a Reloader to wrap code execution.  In order to
            # constantize the worker and instantiate an instance, we have to call
            # the Reloader.  It handles code loading, db connection management, etc.
            # Effectively this block denotes a "unit of work" to Rails.
            @reloader.call do
              klass = Object.const_get(job_hash["class"])
              instance = klass.new
              instance.jid = job_hash["jid"]
              instance._context = self
              @retrier.local(instance, jobstr, queue) do
                yield instance
              end
            end
          end
        end
      end
    end
  end
end