Sha256: d09a06678aaa06e59029e076c4d8cf631c7784269d0080452029a8d8de6454bc

Contents?: true

Size: 1.08 KB

Versions: 1

Compression:

Stored size: 1.08 KB

Contents

module Asyncapi::Server
  class JobWorker

    include Sidekiq::Worker
    sidekiq_options retry: false
    MAX_RETRIES = 2

    def perform(job_id, retries=0)
      job = Job.find(job_id)
      runner_class = job.class_name.constantize

      job_status = :success
      job_message = runner_class.call(job.params)
    rescue => e
      job_status = :error
      job_message = [e.message, e.backtrace].flatten.join("\n")
      raise e
    ensure
      if job
        job.update_attributes(status: job_status)
        report_job_status(job, job_message)
      else
        # For some reason "ActiveRecord::Base.after_transaction",
        # ":after_commit" and ":after_create" does not prevent
        # the ActiveRecord-Sidekiq race condition. In order to
        # prevent this just retry running JobWorker until it finds
        # the job by job_id.
        if retries <= MAX_RETRIES
          JobWorker.perform_async(job_id, retries+1)
        end
      end
    end

    private

    def report_job_status(job, job_message)
      JobStatusNotifierWorker.perform_async(job.id, job_message)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
asyncapi-server-1.3.0 app/workers/asyncapi/server/job_worker.rb