Sha256: e8e952b54ca57dd9d19021319422d210e1bcda7ce04c7e164804ac1b51fb6cea

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 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)
      Typhoeus.put(
        job.callback_url,
        body: {
          job: {
            status: job.status,
            message: job_message,
            secret: job.secret,
          }
        }.to_json,
        headers: {
          "Content-Type" => "application/json",
          Accept: "application/json"
        }
      )
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
asyncapi-server-1.2.0 app/workers/asyncapi/server/job_worker.rb
asyncapi-server-1.1.3 app/workers/asyncapi/server/job_worker.rb