Class: Workhorse::DbJob

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/workhorse/db_job.rb

Constant Summary collapse

STATE_WAITING =
:waiting
STATE_LOCKED =
:locked
STATE_STARTED =
:started
STATE_SUCCEEDED =
:succeeded
STATE_FAILED =
:failed

Instance Method Summary collapse

Instance Method Details

#assert_locked_by!(worker_id) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/workhorse/db_job.rb', line 61

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

#assert_state!(*states) ⇒ Object



55
56
57
58
59
# File 'lib/workhorse/db_job.rb', line 55

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

#mark_failed!(exception) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/workhorse/db_job.rb', line 38

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

#mark_locked!(worker_id) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/workhorse/db_job.rb', line 15

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

#mark_started!Object



30
31
32
33
34
35
36
# File 'lib/workhorse/db_job.rb', line 30

def mark_started!
  assert_state! STATE_LOCKED

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

#mark_succeeded!Object



47
48
49
50
51
52
53
# File 'lib/workhorse/db_job.rb', line 47

def mark_succeeded!
  assert_state! STATE_STARTED

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