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:



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

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



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

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
# 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] = { :id => :string }

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

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



50
51
52
53
# File 'lib/boss_queue/boss_queue.rb', line 50

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



55
56
57
58
# File 'lib/boss_queue/boss_queue.rb', line 55

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:



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

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:



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

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

.sqs_queueObject

:nodoc:



81
82
83
# File 'lib/boss_queue/boss_queue.rb', line 81

def self.sqs_queue # :nodoc:
  AWS::SQS.new.queues[AWS::SQS.new.queues.url_for(self.queue_name)]
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



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

def self.work
  self.sqs_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(job_id.body)
    job.queue_name = self.queue_name
    job.work
  end
end