Module: Resque
- Extended by:
- Resque
- Includes:
- Helpers
- Included in:
- Resque
- Defined in:
- lib/resque.rb,
lib/resque/job.rb,
lib/resque/stat.rb,
lib/resque/errors.rb,
lib/resque/plugin.rb,
lib/resque/server.rb,
lib/resque/worker.rb,
lib/resque/failure.rb,
lib/resque/helpers.rb,
lib/resque/version.rb,
lib/resque/queue_stats.rb,
lib/resque/failure/base.rb,
lib/resque/failure/mongo.rb,
lib/resque/failure/hoptoad.rb,
lib/resque/failure/multiple.rb,
lib/resque/server/test_helper.rb
Defined Under Namespace
Modules: Failure, Helpers, Plugin, Stat, TestHelper Classes: DirtyExit, Job, NoClassError, NoQueueError, QueueStats, Server, Worker
Constant Summary collapse
- Version =
VERSION = '1.15.1'
Instance Attribute Summary collapse
-
#verbose ⇒ Object
Returns the value of attribute verbose.
-
#very_verbose ⇒ Object
Returns the value of attribute very_verbose.
Instance Method Summary collapse
- #add_indexes ⇒ Object
-
#after_fork(&block) ⇒ Object
The ‘after_fork` hook will be run in the child process and is passed the current job.
-
#after_fork=(after_fork) ⇒ Object
Set the after_fork proc.
-
#before_first_fork(&block) ⇒ Object
The ‘before_first_fork` hook will be run in the parent process only once, before forking to run the first job.
-
#before_first_fork=(before_first_fork) ⇒ Object
Set a proc that will be called in the parent process before the worker forks for the first time.
-
#before_fork(&block) ⇒ Object
The ‘before_fork` hook will be run in the parent process before every job, so be careful- any changes you make will be permanent for the lifespan of the worker.
-
#before_fork=(before_fork) ⇒ Object
Set the before_fork proc.
-
#dequeue(klass, *args) ⇒ Object
This method can be used to conveniently remove a job from a queue.
-
#enqueue(klass, *args) ⇒ Object
This method can be used to conveniently add a job to a queue.
-
#info ⇒ Object
Returns a hash, similar to redis-rb’s #info, of interesting stats.
- #inline=(inline) ⇒ Object
-
#inline? ⇒ Boolean
(also: #inline)
If ‘inline’ is true Resque will call #perform method inline without queuing it into Redis and without any Resque callbacks.
-
#keys ⇒ Object
Returns an array of all known Resque keys in Redis.
-
#log(message) ⇒ Object
Log a message to STDOUT if we are verbose or very_verbose.
-
#mongo ⇒ Object
Returns the current Mongo connection.
-
#mongo=(server) ⇒ Object
Accepts ‘hostname’ or ‘hostname:port’ or ‘hostname:port/db’ strings or a Mongo::DB object.
- #mongo_failures ⇒ Object
- #mongo_queues ⇒ Object
- #mongo_stats ⇒ Object
- #mongo_workers ⇒ Object
-
#peek(queue, start = 0, count = 1) ⇒ Object
Returns an array of items currently queued.
-
#pop(queue) ⇒ Object
Pops a job off a queue.
-
#push(queue, item) ⇒ Object
Pushes a job onto a queue.
-
#queue_from_class(klass) ⇒ Object
Given a class, try to extrapolate an appropriate queue based on a class instance variable or ‘queue` method.
-
#queues(names = nil) ⇒ Object
Returns an array of all known Resque queues as strings, filtered by the given names or prefixes.
-
#remove_queue(queue) ⇒ Object
Given a queue name, completely deletes the queue.
-
#remove_worker(worker_id) ⇒ Object
A shortcut to unregister_worker useful for command line tool.
-
#reserve(queue) ⇒ Object
This method will return a ‘Resque::Job` object or a non-true value depending on whether a job can be obtained.
-
#size(queue) ⇒ Object
Returns an integer representing the size of a queue.
- #to_s ⇒ Object
-
#validate(klass, queue = nil) ⇒ Object
Validates if the given klass could be a valid Resque job.
-
#watch_queue(queue) ⇒ Object
Used internally to keep track of which queues we’ve created.
-
#workers ⇒ Object
A shortcut to Worker.all.
-
#working ⇒ Object
A shortcut to Worker.working.
Methods included from Helpers
#classify, #constantize, #decode, #encode
Instance Attribute Details
#verbose ⇒ Object
Returns the value of attribute verbose.
27 28 29 |
# File 'lib/resque.rb', line 27 def verbose @verbose end |
#very_verbose ⇒ Object
Returns the value of attribute very_verbose.
28 29 30 |
# File 'lib/resque.rb', line 28 def very_verbose @very_verbose end |
Instance Method Details
#add_indexes ⇒ Object
149 150 151 152 153 154 155 156 |
# File 'lib/resque.rb', line 149 def add_indexes @mongo.create_index([[:queue,1],[:date, 1]]) @mongo.create_index :queue @workers.create_index :worker @stats.create_index :stat @queues.create_index(:queue,:unique => 1) @failures.create_index :queue end |
#after_fork(&block) ⇒ Object
The ‘after_fork` hook will be run in the child process and is passed the current job. Any changes you make, therefore, will only live as long as the job currently being processed.
Call with a block to set the hook. Call with no arguments to return the hook.
135 136 137 |
# File 'lib/resque.rb', line 135 def after_fork(&block) block ? (@after_fork = block) : @after_fork end |
#after_fork=(after_fork) ⇒ Object
Set the after_fork proc.
140 141 142 |
# File 'lib/resque.rb', line 140 def after_fork=(after_fork) @after_fork = after_fork end |
#before_first_fork(&block) ⇒ Object
The ‘before_first_fork` hook will be run in the parent process only once, before forking to run the first job. Be careful- any changes you make will be permanent for the lifespan of the worker.
Call with a block to set the hook. Call with no arguments to return the hook.
104 105 106 |
# File 'lib/resque.rb', line 104 def before_first_fork(&block) block ? (@before_first_fork = block) : @before_first_fork end |
#before_first_fork=(before_first_fork) ⇒ Object
Set a proc that will be called in the parent process before the worker forks for the first time.
110 111 112 |
# File 'lib/resque.rb', line 110 def before_first_fork=(before_first_fork) @before_first_fork = before_first_fork end |
#before_fork(&block) ⇒ Object
The ‘before_fork` hook will be run in the parent process before every job, so be careful- any changes you make will be permanent for the lifespan of the worker.
Call with a block to set the hook. Call with no arguments to return the hook.
120 121 122 |
# File 'lib/resque.rb', line 120 def before_fork(&block) block ? (@before_fork = block) : @before_fork end |
#before_fork=(before_fork) ⇒ Object
Set the before_fork proc.
125 126 127 |
# File 'lib/resque.rb', line 125 def before_fork=(before_fork) @before_fork = before_fork end |
#dequeue(klass, *args) ⇒ Object
This method can be used to conveniently remove a job from a queue. It assumes the class you’re passing it is a real Ruby class (not a string or reference) which either:
a) has a @queue ivar set
b) responds to `queue`
If either of those conditions are met, it will use the value obtained from performing one of the above operations to determine the queue.
If no queue can be inferred this method will raise a ‘Resque::NoQueueError`
If no args are given, this method will dequeue all jobs matching the provided class. See ‘Resque::Job.destroy` for more information.
Returns the number of jobs destroyed.
Example:
# Removes all jobs of class `UpdateNetworkGraph`
Resque.dequeue(GitHub::Jobs::UpdateNetworkGraph)
# Removes all jobs of class `UpdateNetworkGraph` with matching args.
Resque.dequeue(GitHub::Jobs::UpdateNetworkGraph, 'repo:135325')
This method is considered part of the ‘stable` API.
296 297 298 |
# File 'lib/resque.rb', line 296 def dequeue(klass, *args) Job.destroy(queue_from_class(klass), klass, *args) end |
#enqueue(klass, *args) ⇒ Object
This method can be used to conveniently add a job to a queue. It assumes the class you’re passing it is a real Ruby class (not a string or reference) which either:
a) has a @queue ivar set
b) responds to `queue`
If either of those conditions are met, it will use the value obtained from performing one of the above operations to determine the queue.
If no queue can be inferred this method will raise a ‘Resque::NoQueueError`
This method is considered part of the ‘stable` API.
261 262 263 264 265 266 267 |
# File 'lib/resque.rb', line 261 def enqueue(klass, *args) Job.create(queue_from_class(klass), klass, *args) Plugin.after_enqueue_hooks(klass).each do |hook| klass.send(hook, *args) end end |
#info ⇒ Object
Returns a hash, similar to redis-rb’s #info, of interesting stats.
360 361 362 363 364 365 366 367 368 369 370 371 |
# File 'lib/resque.rb', line 360 def info return { :pending => queues.inject(0) { |m,k| m + size(k) }, :processed => Stat[:processed], :queues => queues.size, :workers => workers.size.to_i, :working => working.size, :failed => Stat[:failed], :servers => "#{@con.primary[0]}:#{@con.primary[1]}/#{@db.name}/#{@mongo.name}", :environment => ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development', } end |
#inline=(inline) ⇒ Object
166 167 168 |
# File 'lib/resque.rb', line 166 def inline=(inline) @inline = inline end |
#inline? ⇒ Boolean Also known as: inline
If ‘inline’ is true Resque will call #perform method inline without queuing it into Redis and without any Resque callbacks. The ‘inline’ is false Resque jobs will be put in queue regularly.
161 162 163 |
# File 'lib/resque.rb', line 161 def inline? @inline end |
#keys ⇒ Object
Returns an array of all known Resque keys in Redis. Redis’ KEYS operation is O(N) for the keyspace, so be careful - this can be slow for big databases.
375 376 377 |
# File 'lib/resque.rb', line 375 def keys queues end |
#log(message) ⇒ Object
Log a message to STDOUT if we are verbose or very_verbose.
381 382 383 384 385 386 387 388 |
# File 'lib/resque.rb', line 381 def log() if verbose puts "*** #{message}" elsif very_verbose time = Time.now.strftime('%I:%M:%S %Y-%m-%d') puts "** [#{time}] #$$: #{message}" end end |
#mongo ⇒ Object
Returns the current Mongo connection. If none has been created, will create a new one.
67 68 69 70 71 |
# File 'lib/resque.rb', line 67 def mongo return @mongo if @mongo self.mongo = ENV['MONGO']||'localhost:27017' self.mongo end |
#mongo=(server) ⇒ Object
Accepts ‘hostname’ or ‘hostname:port’ or ‘hostname:port/db’ strings or a Mongo::DB object.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/resque.rb', line 32 def mongo=(server) @verbose = ENV['LOGGING']||ENV['VERBOSE'] @very_verbose = ENV['VVERBOSE'] @con.close if @con case server when String match = server.match(/([^:]+):?(\d*)\/?(\w*)/) # http://rubular.com/r/G6O8qe0DJ5 host = match[1] port = match[2].nil? || match[2] == '' ? '27017' : match[2] db = match[3].nil? || match[3] == '' ? 'monque' : match[3] log "Initializing connection to #{host}:#{port}" @con = Mongo::Connection.new(host, port) @db = @con.db(db) when Mongo::DB @con = server.connection @db = server else raise "I don't know what to do with #{server.inspect}" unless server.is_a?(String) || server.is_a?(Mongo::Connection) end @mongo = @db.collection('monque') @workers = @db.collection('workers') @failures = @db.collection('failures') @stats = @db.collection('stats') @queues = @db.collection('queues') log "Creating/updating indexes" add_indexes end |
#mongo_failures ⇒ Object
79 80 81 82 83 |
# File 'lib/resque.rb', line 79 def mongo_failures return @failures if @failures self.mongo = ENV['MONGO']||'localhost:27017' @failures end |
#mongo_queues ⇒ Object
91 92 93 94 95 |
# File 'lib/resque.rb', line 91 def mongo_queues return @queues if @queues self.mongo = ENV['MONGO']||'localhost:27017' @queues end |
#mongo_stats ⇒ Object
85 86 87 88 89 |
# File 'lib/resque.rb', line 85 def mongo_stats return @stats if @stats self.mongo = ENV['MONGO']||'localhost:27017' @stats end |
#mongo_workers ⇒ Object
73 74 75 76 77 |
# File 'lib/resque.rb', line 73 def mongo_workers return @workers if @workers self.mongo = ENV['MONGO']||'localhost:27017' @workers end |
#peek(queue, start = 0, count = 1) ⇒ Object
Returns an array of items currently queued. Queue name should be a string.
start and count should be integer and can be used for pagination. start is the item to begin, count is how many items to return.
To get the 3rd page of a 30 item, paginatied list one would use:
Resque.peek('my_list', 59, 30)
211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/resque.rb', line 211 def peek(queue, start = 0, count = 1) start, count = [start, count].map { |n| Integer(n) } res = mongo.find(:queue => queue).sort([:date, 1]).skip(start).limit(count).to_a res.collect! { |doc| doc['item'] } if count == 1 return nil if res.empty? res.first else return [] if res.empty? res end end |
#pop(queue) ⇒ Object
Pops a job off a queue. Queue name should be a string.
Returns a Ruby object.
185 186 187 188 189 190 191 192 193 194 |
# File 'lib/resque.rb', line 185 def pop(queue) doc = mongo.find_and_modify( :query => { :queue => queue.to_s }, :sort => [[:date, 1]], :remove => true ) QueueStats.remove_job(queue) doc['item'] rescue Mongo::OperationFailure => e return nil if e. =~ /No matching object/ raise e end |
#push(queue, item) ⇒ Object
Pushes a job onto a queue. Queue name should be a string and the item should be any JSON-able Ruby object.
176 177 178 179 180 |
# File 'lib/resque.rb', line 176 def push(queue, item) watch_queue(queue) mongo << { :queue => queue.to_s, :item => item , :date => Time.now } QueueStats.add_job(queue) end |
#queue_from_class(klass) ⇒ Object
Given a class, try to extrapolate an appropriate queue based on a class instance variable or ‘queue` method.
302 303 304 305 |
# File 'lib/resque.rb', line 302 def queue_from_class(klass) klass.instance_variable_get(:@queue) || (klass.respond_to?(:queue) and klass.queue) end |
#queues(names = nil) ⇒ Object
Returns an array of all known Resque queues as strings, filtered by the given names or prefixes.
226 227 228 |
# File 'lib/resque.rb', line 226 def queues(names = nil) QueueStats.list(names) end |
#remove_queue(queue) ⇒ Object
Given a queue name, completely deletes the queue.
231 232 233 234 235 |
# File 'lib/resque.rb', line 231 def remove_queue(queue) log "removing #{queue}" mongo.remove({:queue => queue.to_s}) QueueStats.remove(queue) end |
#remove_worker(worker_id) ⇒ Object
A shortcut to unregister_worker useful for command line tool
350 351 352 353 |
# File 'lib/resque.rb', line 350 def remove_worker(worker_id) worker = Resque::Worker.find(worker_id) worker.unregister_worker end |
#reserve(queue) ⇒ Object
This method will return a ‘Resque::Job` object or a non-true value depending on whether a job can be obtained. You should pass it the precise name of a queue: case matters.
This method is considered part of the ‘stable` API.
312 313 314 |
# File 'lib/resque.rb', line 312 def reserve(queue) Job.reserve(queue) end |
#size(queue) ⇒ Object
Returns an integer representing the size of a queue. Queue name should be a string.
198 199 200 201 |
# File 'lib/resque.rb', line 198 def size(queue) queue_stats = QueueStats.new(queue) queue_stats.size end |
#to_s ⇒ Object
144 145 146 |
# File 'lib/resque.rb', line 144 def to_s "Resque Client connected to #{@con.primary[0]}:#{@con.primary[1]}/#{@db.name}/#{@mongo.name}" end |
#validate(klass, queue = nil) ⇒ Object
Validates if the given klass could be a valid Resque job
If no queue can be inferred this method will raise a ‘Resque::NoQueueError`
If given klass is nil this method will raise a ‘Resque::NoClassError`
321 322 323 324 325 326 327 328 329 330 331 |
# File 'lib/resque.rb', line 321 def validate(klass, queue = nil) queue ||= queue_from_class(klass) if !queue raise NoQueueError.new("Jobs must be placed onto a queue.") end if klass.to_s.empty? raise NoClassError.new("Jobs must be given a class.") end end |
#watch_queue(queue) ⇒ Object
Used internally to keep track of which queues we’ve created. Don’t call this directly.
239 240 241 |
# File 'lib/resque.rb', line 239 def watch_queue(queue) # redis.sadd(:queues, queue.to_s) end |
#workers ⇒ Object
A shortcut to Worker.all
339 340 341 |
# File 'lib/resque.rb', line 339 def workers Worker.all end |
#working ⇒ Object
A shortcut to Worker.working
344 345 346 |
# File 'lib/resque.rb', line 344 def working Worker.working end |