class Barbeque::MessageHandler::JobExecution

Public Class Methods

new(message:, message_queue:) click to toggle source

@param [Barbeque::Message::JobExecution] message @param [Barbeque::MessageQueue] message_queue

# File lib/barbeque/message_handler/job_execution.rb, line 10
def initialize(message:, message_queue:)
  @message = message
  @message_queue = message_queue
end

Public Instance Methods

run() click to toggle source
# File lib/barbeque/message_handler/job_execution.rb, line 15
def run
  job_execution = create_job_execution

  begin
    Executor.create.start_execution(job_execution, job_envs)
  rescue Exception => e
    job_execution.update!(status: :error, finished_at: Time.now)
    Barbeque::ExecutionLog.save_stdout_and_stderr(job_execution, '', "#{e.class}: #{e.message}\n#{e.backtrace.join("\n")}")
    Barbeque::SlackNotifier.notify_job_execution(job_execution)
    raise e
  end
end

Private Instance Methods

create_job_execution() click to toggle source
# File lib/barbeque/message_handler/job_execution.rb, line 47
def create_job_execution
  Barbeque::JobExecution.transaction do
    Barbeque::JobExecution.create(message_id: @message.id, job_definition: job_definition, job_queue: @message_queue.job_queue).tap do |job_execution|
      Barbeque::ExecutionLog.save_message(job_execution, @message)
      @message_queue.delete_message(@message)
    end
  end
rescue ActiveRecord::RecordNotUnique => e
  # There's a case where Barbeque receives message which was already received or deleted.
  # https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html
  @message_queue.delete_message(@message)
  raise DuplicatedExecution.new(e.message)
end
job_definition() click to toggle source
# File lib/barbeque/message_handler/job_execution.rb, line 40
def job_definition
  @job_definition ||= Barbeque::JobDefinition.joins(:app).find_by!(
    job: @message.job,
    barbeque_apps: { name: @message.application },
  )
end
job_envs() click to toggle source
# File lib/barbeque/message_handler/job_execution.rb, line 30
def job_envs
  {
    'BARBEQUE_JOB'         => @message.job,
    'BARBEQUE_MESSAGE'     => @message.body.to_json,
    'BARBEQUE_MESSAGE_ID'  => @message.id,
    'BARBEQUE_QUEUE_NAME'  => @message_queue.job_queue.name,
    'BARBEQUE_RETRY_COUNT' => '0',
  }
end