Sha256: 93a9d1f9a7a2a49119dd59d1a159a7e946681c628c0478b67f590d95ec5a2db4

Contents?: true

Size: 1.55 KB

Versions: 8

Compression:

Stored size: 1.55 KB

Contents

module Workhorse
  class DbJob < ActiveRecord::Base
    STATE_WAITING   = :waiting
    STATE_LOCKED    = :locked
    STATE_STARTED   = :started
    STATE_SUCCEEDED = :succeeded
    STATE_FAILED    = :failed

    self.table_name = 'jobs'

    def mark_locked!(worker_id)
      if changed?
        fail "Dirty jobs can't be locked."
      end

      if locked_at
        fail "Job #{id} is already locked by #{locked_by.inspect}."
      end

      self.locked_at = Time.now
      self.locked_by = worker_id
      self.state     = STATE_LOCKED
      save!
    end

    def mark_started!
      assert_state! STATE_LOCKED

      self.started_at = Time.now
      self.state      = STATE_STARTED
      save!
    end

    def mark_failed!(exception)
      assert_state! STATE_LOCKED, STATE_STARTED

      self.failed_at  = Time.now
      self.last_error = %(#{exception.message}\n#{exception.backtrace.join("\n")})
      self.state      = STATE_FAILED
      save!
    end

    def mark_succeeded!
      assert_state! STATE_STARTED

      self.succeeded_at = Time.now
      self.state        = STATE_SUCCEEDED
      save!
    end

    def assert_state!(*states)
      unless states.include?(state.to_sym)
        fail "Job #{id} is not in state #{states.inspect} but in state #{state.inspect}."
      end
    end

    def assert_locked_by!(worker_id)
      assert_state! STATE_WAITING

      if locked_by.nil?
        fail "Job #{id} is not locked by any worker."
      elsif locked_by != worker_id
        fail "Job #{id} is locked by another worker (#{locked_by})."
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
workhorse-0.3.3 lib/workhorse/db_job.rb
workhorse-0.3.2 lib/workhorse/db_job.rb
workhorse-0.3.1 lib/workhorse/db_job.rb
workhorse-0.3.0 lib/workhorse/db_job.rb
workhorse-0.2.0 lib/workhorse/db_job.rb
workhorse-0.1.0 lib/workhorse/db_job.rb
workhorse-0.0.3 lib/workhorse/db_job.rb
workhorse-0.0.2 lib/workhorse/db_job.rb