Sha256: a631c7662e37d8f380b0fefa9c2cdd1b088f80171d8b438ceba5db4bbb8278b7

Contents?: true

Size: 1.54 KB

Versions: 1

Compression:

Stored size: 1.54 KB

Contents

module QueueClassicPlus
  class CustomWorker < QC::Worker
    class QueueClassicJob < ActiveRecord::Base
    end

    BACKOFF_WIDTH = 10
    FailedQueue = QC::Queue.new("failed_jobs")

    def enqueue_failed(job, e)
      ActiveRecord::Base.transaction do
        FailedQueue.enqueue(job[:method], *job[:args])
        new_job = QueueClassicJob.order(:id).where(q_name: 'failed_jobs').last
        new_job.last_error = if e.backtrace then ([e.message] + e.backtrace ).join("\n") else e.message end
        new_job.save!
      end

      QueueClassicPlus.exception_handler.call(e, job)
      Metrics.increment("qc.errors", source: @q_name)
    end

    def handle_failure(job, e)
      QueueClassicPlus.logger.info "Handling exception #{e.message} for job #{job[:id]}"
      klass = job_klass(job)

      model = QueueClassicJob.find(job[:id])

      # The mailers doesn't have a retries_on?
      if klass && klass.respond_to?(:retries_on?) && klass.retries_on?(e)
        remaining_retries = model.remaining_retries || klass.max_retries
        remaining_retries -= 1

        if remaining_retries > 0
          klass.restart_in((klass.max_retries - remaining_retries) * BACKOFF_WIDTH,
                           remaining_retries,
                           *job[:args])
        else
          enqueue_failed(job, e)
        end
      else
        enqueue_failed(job, e)
      end
      model.destroy
    end

    private
    def job_klass(job)
      begin
        Object.const_get(job[:method].split('.')[0])
      rescue NameError
        nil
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
queue_classic_plus-0.0.2 lib/queue_classic_plus/worker.rb