Class: QueuedTask

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Plok::Loggable
Defined in:
app/models/queued_task.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Plok::Loggable

#log

Class Method Details

.queue(klass, data) ⇒ Object



29
30
31
32
33
# File 'app/models/queued_task.rb', line 29

def self.queue(klass, data)
  task = create!(klass: klass.to_s, data: data.except(:perform_at))
  task.update(perform_at: data[:perform_at]) if data[:perform_at].present?
  task
end

.queue_unless_already_queued(klass, data) ⇒ Object



35
36
37
38
39
# File 'app/models/queued_task.rb', line 35

def self.queue_unless_already_queued(klass, data)
  task = find_by(klass: klass, data: data)
  return task if task.present?
  self.queue(klass, data)
end

Instance Method Details

#dequeue!Object



41
42
43
# File 'app/models/queued_task.rb', line 41

def dequeue!
  destroy
end

#execute!Object



25
26
27
# File 'app/models/queued_task.rb', line 25

def execute!
  klass.to_s.constantize.new(data).execute!
end

#lock!Object



13
14
15
# File 'app/models/queued_task.rb', line 13

def lock!
  update_attribute :locked, true
end

#process!Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/models/queued_task.rb', line 45

def process!
  lock!

  begin
    execute!
    dequeue!
  rescue
    raise
  ensure
    unlock! unless destroyed?
  end
end

#stuck?Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
# File 'app/models/queued_task.rb', line 58

def stuck?
  return false if locked?
  # Make sure task is past its perform_at timestamp.
  return perform_at <= 30.minutes.ago if perform_at.present?
  created_at <= 30.minutes.ago
end

#unlock!Object



17
18
19
# File 'app/models/queued_task.rb', line 17

def unlock!
  update_attribute :locked, false
end

#unlocked?Boolean

Returns:

  • (Boolean)


21
22
23
# File 'app/models/queued_task.rb', line 21

def unlocked?
  !locked?
end