Class: BossQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/boss_queue/job.rb,
lib/boss_queue/boss_queue.rb

Defined Under Namespace

Classes: Job

Class Method Summary collapse

Class Method Details

.create_job(class_or_instance, method_name, *args) ⇒ Object

:nodoc:



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/boss_queue/boss_queue.rb', line 62

def self.create_job(class_or_instance, method_name, *args) # :nodoc:
  job = BossQueue::Job.shard(table_name).new
  if class_or_instance.is_a?(Class)
    class_name = class_or_instance.to_s
    instance_id = nil
    job.kind = "#{class_name}@#{method_name}"
  else
    class_name = class_or_instance.class.to_s
    instance_id = class_or_instance.id
    job.kind = "#{class_name}##{method_name}"
  end
  job.queue_name = self.queue_name
  job.failure_action = self.failure_action
  job.model_class_name = class_name
  job.model_id = instance_id unless instance_id.nil?
  job.job_method = method_name.to_s
  job.job_arguments = JSON.generate(args)
  job.save!
  job
end

.create_queueObject



38
39
40
# File 'lib/boss_queue/boss_queue.rb', line 38

def self.create_queue
  AWS::SQS::QueueCollection.new.create(self.queue_name, :default_visibility_timeout => 5 * 60)
end

.create_table(read_capacity = 1, write_capacity = 1, options = {}) ⇒ Object



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

def self.create_table(read_capacity=1, write_capacity=1, options={})
  create_opts = {}
  create_opts[:hash_key] = { self.hash_key => :string }
  create_opts[:range_key] = { :kind => :string }

  AWS::DynamoDB.new.tables.create(self.table_name, read_capacity, write_capacity, create_opts)
end

.enqueue(class_or_instance, method_name, *args) ⇒ Object



52
53
54
55
# File 'lib/boss_queue/boss_queue.rb', line 52

def self.enqueue(class_or_instance, method_name, *args)
  job = self.create_job(class_or_instance, method_name, *args)
  job.enqueue
end

.enqueue_with_delay(delay, class_or_instance, method_name, *args) ⇒ Object



57
58
59
60
# File 'lib/boss_queue/boss_queue.rb', line 57

def self.enqueue_with_delay(delay, class_or_instance, method_name, *args)
  job = self.create_job(class_or_instance, method_name, *args)
  job.enqueue_with_delay(delay)
end

.environmentObject

:nodoc:



83
84
85
86
87
88
89
90
91
# File 'lib/boss_queue/boss_queue.rb', line 83

def self.environment # :nodoc:
  @@environment ||= if Module.const_get('Rails')
                      Rails.env
                    elsif Module.const_get('Rack')
                      Rack.env
                    else
                      raise 'BossQueue requires an environment'
                    end
end

.environment=(env) ⇒ Object



6
7
8
# File 'lib/boss_queue/boss_queue.rb', line 6

def self.environment=(env)
  @@environment = env
end

.failure_actionObject



12
13
14
# File 'lib/boss_queue/boss_queue.rb', line 12

def self.failure_action
  @@failure_action ||= 'retry'
end

.failure_action=(env) ⇒ Object



16
17
18
# File 'lib/boss_queue/boss_queue.rb', line 16

def self.failure_action=(env)
  @@failure_action = env
end

.queue_nameObject



25
26
27
# File 'lib/boss_queue/boss_queue.rb', line 25

def self.queue_name
  "#{self.queue_prefix}boss_queue"
end

.queue_prefixObject

:nodoc:



93
94
95
96
97
98
99
100
101
102
# File 'lib/boss_queue/boss_queue.rb', line 93

def self.queue_prefix # :nodoc:
  case self.environment
  when 'production'
    ''
  when 'development'
    'dev_'
  else
    environment + '_'
  end
end

.table_nameObject



21
22
23
# File 'lib/boss_queue/boss_queue.rb', line 21

def self.table_name
  "#{self.queue_prefix}boss_queue_jobs"
end

.workObject



42
43
44
45
46
47
48
49
50
# File 'lib/boss_queue/boss_queue.rb', line 42

def self.work
  queue = AWS::SQS.new.queues[self.queue_name]
  queue.receive_message do |job_id|
    # When a block is given, each message is yielded to the block and then deleted as long as the block exits normally - http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html
    job = BossQueue::Job.shard(table_name).find_by_id(job_id.body)
    job.queue_name = self.queue_name
    job.work
  end
end