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/redis.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.17.2'
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.
21 22 23 |
# File 'lib/resque.rb', line 21 def verbose @verbose end |
#very_verbose ⇒ Object
Returns the value of attribute very_verbose.
22 23 24 |
# File 'lib/resque.rb', line 22 def very_verbose @very_verbose end |
Instance Method Details
#add_indexes ⇒ Object
143 144 145 146 147 148 149 150 |
# File 'lib/resque.rb', line 143 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.
129 130 131 |
# File 'lib/resque.rb', line 129 def after_fork(&block) block ? (@after_fork = block) : @after_fork end |
#after_fork=(after_fork) ⇒ Object
Set the after_fork proc.
134 135 136 |
# File 'lib/resque.rb', line 134 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.
98 99 100 |
# File 'lib/resque.rb', line 98 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.
104 105 106 |
# File 'lib/resque.rb', line 104 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.
114 115 116 |
# File 'lib/resque.rb', line 114 def before_fork(&block) block ? (@before_fork = block) : @before_fork end |
#before_fork=(before_fork) ⇒ Object
Set the before_fork proc.
119 120 121 |
# File 'lib/resque.rb', line 119 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.
310 311 312 |
# File 'lib/resque.rb', line 310 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.
269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'lib/resque.rb', line 269 def enqueue(klass, *args) # Perform before_enqueue hooks. Don't perform enqueue if any hook returns false before_hooks = Plugin.before_enqueue_hooks(klass).collect do |hook| klass.send(hook, *args) end return if before_hooks.any? { |result| result == false } 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.
374 375 376 377 378 379 380 381 382 383 384 385 |
# File 'lib/resque.rb', line 374 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
160 161 162 |
# File 'lib/resque.rb', line 160 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.
155 156 157 |
# File 'lib/resque.rb', line 155 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.
389 390 391 |
# File 'lib/resque.rb', line 389 def keys queues end |
#log(message) ⇒ Object
Log a message to STDOUT if we are verbose or very_verbose.
395 396 397 398 399 400 401 402 |
# File 'lib/resque.rb', line 395 def log() if verbose puts "*** #{}" elsif very_verbose time = Time.now.strftime('%I:%M:%S %Y-%m-%d') puts "** [#{time}] #$$: #{}" end end |
#mongo ⇒ Object
Returns the current Mongo connection. If none has been created, will create a new one.
61 62 63 64 65 |
# File 'lib/resque.rb', line 61 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.
26 27 28 29 30 31 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 |
# File 'lib/resque.rb', line 26 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
73 74 75 76 77 |
# File 'lib/resque.rb', line 73 def mongo_failures return @failures if @failures self.mongo = ENV['MONGO']||'localhost:27017' @failures end |
#mongo_queues ⇒ Object
85 86 87 88 89 |
# File 'lib/resque.rb', line 85 def mongo_queues return @queues if @queues self.mongo = ENV['MONGO']||'localhost:27017' @queues end |
#mongo_stats ⇒ Object
79 80 81 82 83 |
# File 'lib/resque.rb', line 79 def mongo_stats return @stats if @stats self.mongo = ENV['MONGO']||'localhost:27017' @stats end |
#mongo_workers ⇒ Object
67 68 69 70 71 |
# File 'lib/resque.rb', line 67 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)
219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/resque.rb', line 219 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.
192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/resque.rb', line 192 def pop(queue) doc = mongo.find_and_modify( :query => { :queue => queue.to_s }, :sort => [[:date, 1]], :remove => true ) return if doc.nil? 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.
Resque works generally expect the ‘item` to be a hash with the following keys:
class - The String name of the job to run.
args - An Array of arguments to pass the job. Usually passed
via `class.to_class.perform(*args)`.
Example
Resque.push('archive', :class => 'Archive', :args => [ 35, 'tar' ])
Returns nothing
183 184 185 186 187 |
# File 'lib/resque.rb', line 183 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.
316 317 318 319 |
# File 'lib/resque.rb', line 316 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.
234 235 236 |
# File 'lib/resque.rb', line 234 def queues(names = nil) QueueStats.list(names) end |
#remove_queue(queue) ⇒ Object
Given a queue name, completely deletes the queue.
239 240 241 242 243 |
# File 'lib/resque.rb', line 239 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
364 365 366 367 |
# File 'lib/resque.rb', line 364 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.
326 327 328 |
# File 'lib/resque.rb', line 326 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.
206 207 208 209 |
# File 'lib/resque.rb', line 206 def size(queue) queue_stats = QueueStats.new(queue) queue_stats.size end |
#to_s ⇒ Object
138 139 140 |
# File 'lib/resque.rb', line 138 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`
335 336 337 338 339 340 341 342 343 344 345 |
# File 'lib/resque.rb', line 335 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.
247 248 249 |
# File 'lib/resque.rb', line 247 def watch_queue(queue) # redis.sadd(:queues, queue.to_s) end |