resque_admin 0.2.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +30 -30
- data/README.markdown +83 -83
- data/Rakefile +1 -1
- data/bin/{resque-admin → resque} +8 -8
- data/bin/{resque-admin-web → resque-web} +5 -5
- data/lib/{resque_admin → resque}/data_store.rb +4 -4
- data/lib/{resque_admin → resque}/errors.rb +1 -1
- data/lib/{resque_admin → resque}/failure/airbrake.rb +4 -4
- data/lib/{resque_admin → resque}/failure/base.rb +1 -1
- data/lib/{resque_admin → resque}/failure/multiple.rb +2 -2
- data/lib/{resque_admin → resque}/failure/redis.rb +7 -7
- data/lib/{resque_admin → resque}/failure/redis_multi_queue.rb +11 -11
- data/lib/{resque_admin → resque}/failure.rb +8 -8
- data/lib/{resque_admin → resque}/helpers.rb +9 -9
- data/lib/{resque_admin → resque}/job.rb +22 -22
- data/lib/{resque_admin → resque}/log_formatters/quiet_formatter.rb +1 -1
- data/lib/{resque_admin → resque}/log_formatters/verbose_formatter.rb +1 -1
- data/lib/{resque_admin → resque}/log_formatters/very_verbose_formatter.rb +1 -1
- data/lib/{resque_admin → resque}/logging.rb +2 -2
- data/lib/{resque_admin → resque}/plugin.rb +2 -2
- data/lib/{resque_admin → resque}/server/helpers.rb +4 -4
- data/lib/{resque_admin → resque}/server/public/favicon.ico +0 -0
- data/lib/{resque_admin → resque}/server/public/idle.png +0 -0
- data/lib/{resque_admin → resque}/server/public/jquery-1.12.4.min.js +0 -0
- data/lib/{resque_admin → resque}/server/public/jquery.relatize_date.js +0 -0
- data/lib/{resque_admin → resque}/server/public/poll.png +0 -0
- data/lib/{resque_admin → resque}/server/public/ranger.js +0 -0
- data/lib/{resque_admin → resque}/server/public/reset.css +0 -0
- data/lib/{resque_admin → resque}/server/public/style.css +0 -0
- data/lib/{resque_admin → resque}/server/public/working.png +0 -0
- data/lib/{resque_admin → resque}/server/test_helper.rb +3 -3
- data/lib/{resque_admin → resque}/server/views/error.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/failed.erb +2 -2
- data/lib/{resque_admin → resque}/server/views/failed_job.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/failed_queues_overview.erb +3 -3
- data/lib/{resque_admin → resque}/server/views/job_class.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/key_sets.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/key_string.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/layout.erb +6 -6
- data/lib/{resque_admin → resque}/server/views/next_more.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/overview.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/processing.erb +0 -0
- data/lib/{resque_admin → resque}/server/views/queues.erb +5 -5
- data/lib/{resque_admin → resque}/server/views/stats.erb +1 -1
- data/lib/{resque_admin → resque}/server/views/workers.erb +4 -4
- data/lib/{resque_admin → resque}/server/views/working.erb +1 -1
- data/lib/{resque_admin → resque}/server.rb +35 -35
- data/lib/{resque_admin → resque}/stat.rb +2 -2
- data/lib/{resque_admin → resque}/tasks.rb +11 -11
- data/lib/{resque_admin → resque}/thread_signal.rb +1 -1
- data/lib/{resque_admin → resque}/vendor/utf8_util.rb +0 -0
- data/lib/resque/version.rb +3 -0
- data/lib/{resque_admin → resque}/worker.rb +29 -29
- data/lib/{resque_admin.rb → resque.rb} +27 -27
- data/lib/tasks/{resque_admin.rake → resque.rake} +1 -1
- metadata +60 -60
- data/lib/resque_admin/version.rb +0 -3
data/README.markdown
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
Resque
|
2
2
|
======
|
3
3
|
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/resque.svg)](https://rubygems.org/gems/resque)
|
5
5
|
[![Build Status](https://travis-ci.org/resque/resque.svg)](https://travis-ci.org/resque/resque)
|
6
6
|
[![Coverage Status](https://coveralls.io/repos/github/resque/resque/badge.svg?branch=1-x-stable)](https://coveralls.io/r/resque/resque?branch=1-x-stable)
|
7
7
|
|
8
|
-
|
8
|
+
Resque (pronounced like "rescue") is a Redis-backed library for creating
|
9
9
|
background jobs, placing those jobs on multiple queues, and processing
|
10
10
|
them later.
|
11
11
|
|
@@ -14,44 +14,44 @@ Background jobs can be any Ruby class or module that responds to
|
|
14
14
|
jobs or you can create new classes specifically to do work. Or, you
|
15
15
|
can do both.
|
16
16
|
|
17
|
-
|
17
|
+
Resque is heavily inspired by DelayedJob (which rocks) and comprises
|
18
18
|
three parts:
|
19
19
|
|
20
20
|
1. A Ruby library for creating, querying, and processing jobs
|
21
21
|
2. A Rake task for starting a worker which processes jobs
|
22
22
|
3. A Sinatra app for monitoring queues, jobs, and workers.
|
23
23
|
|
24
|
-
|
24
|
+
Resque workers can be distributed between multiple machines,
|
25
25
|
support priorities, are resilient to memory bloat / "leaks," are
|
26
26
|
optimized for REE (but work on MRI and JRuby), tell you what they're
|
27
27
|
doing, and expect failure.
|
28
28
|
|
29
|
-
|
29
|
+
Resque queues are persistent; support constant time, atomic push and
|
30
30
|
pop (thanks to Redis); provide visibility into their contents; and
|
31
31
|
store jobs as simple JSON packages.
|
32
32
|
|
33
|
-
The
|
33
|
+
The Resque frontend tells you what workers are doing, what workers are
|
34
34
|
not doing, what queues you're using, what's in those queues, provides
|
35
35
|
general usage stats, and helps you track failures.
|
36
36
|
|
37
|
-
|
37
|
+
Resque now supports Ruby 2.0.0 and above. Any future updates will not be
|
38
38
|
guaranteed to work without defects on any Rubies older than 2.0.0. We will also only be supporting Redis 3.0 and above going forward.
|
39
39
|
|
40
40
|
|
41
41
|
The Blog Post
|
42
42
|
-------------
|
43
43
|
|
44
|
-
For the backstory, philosophy, and history of
|
44
|
+
For the backstory, philosophy, and history of Resque's beginnings,
|
45
45
|
please see [the blog post][0].
|
46
46
|
|
47
47
|
|
48
48
|
Overview
|
49
49
|
--------
|
50
50
|
|
51
|
-
|
51
|
+
Resque allows you to create jobs and place them on a queue, then,
|
52
52
|
later, pull those jobs off the queue and process them.
|
53
53
|
|
54
|
-
|
54
|
+
Resque jobs are Ruby classes (or modules) which respond to the
|
55
55
|
`perform` method. Here's an example:
|
56
56
|
|
57
57
|
|
@@ -76,7 +76,7 @@ to our application's pre-existing `Repository` class:
|
|
76
76
|
``` ruby
|
77
77
|
class Repository
|
78
78
|
def async_create_archive(branch)
|
79
|
-
|
79
|
+
Resque.enqueue(Archive, self.id, branch)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
```
|
@@ -88,7 +88,7 @@ queue.
|
|
88
88
|
Later, a worker will run something like this code to process the job:
|
89
89
|
|
90
90
|
``` ruby
|
91
|
-
klass, args =
|
91
|
+
klass, args = Resque.reserve(:file_serve)
|
92
92
|
klass.perform(*args) if klass.respond_to? :perform
|
93
93
|
```
|
94
94
|
|
@@ -103,9 +103,9 @@ Let's start a worker to run `file_serve` jobs:
|
|
103
103
|
$ cd app_root
|
104
104
|
$ QUEUE=file_serve rake resque:work
|
105
105
|
|
106
|
-
This starts one
|
106
|
+
This starts one Resque worker and tells it to work off the
|
107
107
|
`file_serve` queue. As soon as it's ready it'll try to run the
|
108
|
-
`
|
108
|
+
`Resque.reserve` code snippet above and process jobs until it can't
|
109
109
|
find any more, at which point it will sleep for a small period and
|
110
110
|
repeatedly poll the queue for more jobs.
|
111
111
|
|
@@ -120,7 +120,7 @@ Jobs
|
|
120
120
|
What should you run in the background? Anything that takes any time at
|
121
121
|
all. Slow INSERT statements, disk manipulating, data processing, etc.
|
122
122
|
|
123
|
-
At GitHub we use
|
123
|
+
At GitHub we use Resque to process the following types of jobs:
|
124
124
|
|
125
125
|
* Warming caches
|
126
126
|
* Counting disk usage
|
@@ -134,7 +134,7 @@ At GitHub we use ResqueAdmin to process the following types of jobs:
|
|
134
134
|
|
135
135
|
As of writing we have about 35 different types of background jobs.
|
136
136
|
|
137
|
-
Keep in mind that you don't need a web app to use
|
137
|
+
Keep in mind that you don't need a web app to use Resque - we just
|
138
138
|
mention "foreground" and "background" because they make conceptual
|
139
139
|
sense. You could easily be spidering sites and sticking data which
|
140
140
|
needs to be crunched later into a queue.
|
@@ -164,13 +164,13 @@ Because of this your jobs must only accept arguments that can be JSON encoded.
|
|
164
164
|
So instead of doing this:
|
165
165
|
|
166
166
|
``` ruby
|
167
|
-
|
167
|
+
Resque.enqueue(Archive, self, branch)
|
168
168
|
```
|
169
169
|
|
170
170
|
do this:
|
171
171
|
|
172
172
|
``` ruby
|
173
|
-
|
173
|
+
Resque.enqueue(Archive, self.id, branch)
|
174
174
|
```
|
175
175
|
|
176
176
|
This is why our above example (and all the examples in `examples/`)
|
@@ -197,11 +197,11 @@ We plan to provide first class `async` support in a future release.
|
|
197
197
|
### Failure
|
198
198
|
|
199
199
|
If a job raises an exception, it is logged and handed off to the
|
200
|
-
`
|
200
|
+
`Resque::Failure` module. Failures are logged either locally in Redis
|
201
201
|
or using some different backend. To see exceptions while developing,
|
202
202
|
use VERBOSE env variable, see details below under Logging.
|
203
203
|
|
204
|
-
For example,
|
204
|
+
For example, Resque ships with Airbrake support. To configure it, put
|
205
205
|
the following into an initialisation file or into your rake job:
|
206
206
|
|
207
207
|
``` ruby
|
@@ -210,8 +210,8 @@ require 'resque/failure/multiple'
|
|
210
210
|
require 'resque/failure/redis'
|
211
211
|
require 'resque/failure/airbrake'
|
212
212
|
|
213
|
-
|
214
|
-
|
213
|
+
Resque::Failure::Multiple.classes = [Resque::Failure::Redis, Resque::Failure::Airbrake]
|
214
|
+
Resque::Failure.backend = Resque::Failure::Multiple
|
215
215
|
```
|
216
216
|
|
217
217
|
Keep this in mind when writing your jobs: you may want to throw
|
@@ -221,7 +221,7 @@ exceptions you would not normally throw in order to assist debugging.
|
|
221
221
|
Workers
|
222
222
|
-------
|
223
223
|
|
224
|
-
|
224
|
+
Resque workers are rake tasks that run forever. They basically do this:
|
225
225
|
|
226
226
|
``` ruby
|
227
227
|
start
|
@@ -239,11 +239,11 @@ Starting a worker is simple. Here's our example from earlier:
|
|
239
239
|
|
240
240
|
$ QUEUE=file_serve rake resque:work
|
241
241
|
|
242
|
-
By default
|
242
|
+
By default Resque won't know about your application's
|
243
243
|
environment. That is, it won't be able to find and run your jobs - it
|
244
244
|
needs to load your application into memory.
|
245
245
|
|
246
|
-
If we've installed
|
246
|
+
If we've installed Resque as a Rails plugin, we might run this command
|
247
247
|
from our RAILS_ROOT:
|
248
248
|
|
249
249
|
$ QUEUE=file_serve rake environment resque:work
|
@@ -265,7 +265,7 @@ end
|
|
265
265
|
```
|
266
266
|
|
267
267
|
We don't want the `git_timeout` as high as 10 minutes in our web app,
|
268
|
-
but in the
|
268
|
+
but in the Resque workers it's fine.
|
269
269
|
|
270
270
|
|
271
271
|
### Logging
|
@@ -277,11 +277,11 @@ variable.
|
|
277
277
|
|
278
278
|
$ VVERBOSE=1 QUEUE=file_serve rake environment resque:work
|
279
279
|
|
280
|
-
If you want
|
280
|
+
If you want Resque to log to a file, in Rails do:
|
281
281
|
|
282
282
|
```ruby
|
283
283
|
# config/initializers/resque.rb
|
284
|
-
|
284
|
+
Resque.logger = Logger.new(Rails.root.join('log', "#{Rails.env}_resque.log"))
|
285
285
|
```
|
286
286
|
|
287
287
|
### Process IDs (PIDs)
|
@@ -310,7 +310,7 @@ The default is 5 seconds, but for a semi-active app you may want to use a smalle
|
|
310
310
|
|
311
311
|
### Priorities and Queue Lists
|
312
312
|
|
313
|
-
|
313
|
+
Resque doesn't support numeric priorities but instead uses the order
|
314
314
|
of queues you give it. We call this list of queues the "queue list."
|
315
315
|
|
316
316
|
Let's say we add a `warm_cache` queue in addition to our `file_serve`
|
@@ -364,25 +364,25 @@ so using the `resque:workers` rake task:
|
|
364
364
|
|
365
365
|
$ COUNT=5 QUEUE=* rake resque:workers
|
366
366
|
|
367
|
-
This will spawn five
|
367
|
+
This will spawn five Resque workers, each in its own process. Hitting
|
368
368
|
ctrl-c should be sufficient to stop them all.
|
369
369
|
|
370
370
|
|
371
371
|
### Forking
|
372
372
|
|
373
|
-
On certain platforms, when a
|
373
|
+
On certain platforms, when a Resque worker reserves a job it
|
374
374
|
immediately forks a child process. The child processes the job then
|
375
375
|
exits. When the child has exited successfully, the worker reserves
|
376
376
|
another job and repeats the process.
|
377
377
|
|
378
378
|
Why?
|
379
379
|
|
380
|
-
Because
|
380
|
+
Because Resque assumes chaos.
|
381
381
|
|
382
|
-
|
382
|
+
Resque assumes your background workers will lock up, run too long, or
|
383
383
|
have unwanted memory growth.
|
384
384
|
|
385
|
-
If
|
385
|
+
If Resque workers processed jobs themselves, it'd be hard to whip them
|
386
386
|
into shape. Let's say one is using too much memory: you send it a
|
387
387
|
signal that says "shutdown after you finish processing the current
|
388
388
|
job," and it does so. It then starts up again - loading your entire
|
@@ -392,11 +392,11 @@ delay in queue processing.
|
|
392
392
|
Plus, what if it's using too much memory and has stopped responding to
|
393
393
|
signals?
|
394
394
|
|
395
|
-
Thanks to
|
395
|
+
Thanks to Resque's parent / child architecture, jobs that use too much memory
|
396
396
|
release that memory upon completion. No unwanted growth.
|
397
397
|
|
398
398
|
And what if a job is running too long? You'd need to `kill -9` it then
|
399
|
-
start the worker again. With
|
399
|
+
start the worker again. With Resque's parent / child architecture you
|
400
400
|
can tell the parent to forcefully kill the child then immediately
|
401
401
|
start processing more jobs. No startup delay or wasted cycles.
|
402
402
|
|
@@ -433,7 +433,7 @@ waiting for work on:
|
|
433
433
|
|
434
434
|
### Signals
|
435
435
|
|
436
|
-
|
436
|
+
Resque workers respond to a few different signals:
|
437
437
|
|
438
438
|
* `QUIT` - Wait for child to finish processing then exit
|
439
439
|
* `TERM` / `INT` - Immediately kill child then exit
|
@@ -441,11 +441,11 @@ ResqueAdmin workers respond to a few different signals:
|
|
441
441
|
* `USR2` - Don't start to process any new jobs
|
442
442
|
* `CONT` - Start to process new jobs again after a USR2
|
443
443
|
|
444
|
-
If you want to gracefully shutdown a
|
444
|
+
If you want to gracefully shutdown a Resque worker, use `QUIT`.
|
445
445
|
|
446
446
|
If you want to kill a stale or stuck child, use `USR1`. Processing
|
447
447
|
will continue as normal unless the child was not found. In that case
|
448
|
-
|
448
|
+
Resque assumes the parent process is in a bad state and shuts down.
|
449
449
|
|
450
450
|
If you want to kill a stale or stuck child and shutdown, use `TERM`
|
451
451
|
|
@@ -457,11 +457,11 @@ then `CONT` to start it again.
|
|
457
457
|
|
458
458
|
When shutting down processes, Heroku sends every process a TERM signal at the
|
459
459
|
same time. By default this causes an immediate shutdown of any running job
|
460
|
-
leading to frequent `
|
460
|
+
leading to frequent `Resque::TermException` errors. For short running jobs, a simple
|
461
461
|
solution is to give a small amount of time for the job to finish
|
462
462
|
before killing it.
|
463
463
|
|
464
|
-
|
464
|
+
Resque doesn't handle this out of the box (for both cedar-14 and heroku-16), you need to
|
465
465
|
install the [`resque-heroku-signals`](https://github.com/iloveitaly/resque-heroku-signals)
|
466
466
|
addon which adds the required signal handling to make the behavior described above work.
|
467
467
|
Related issue: https://github.com/resque/resque/issues/1559
|
@@ -471,9 +471,9 @@ To accomplish this set the following environment variables:
|
|
471
471
|
* `RESQUE_PRE_SHUTDOWN_TIMEOUT` - The time between the parent receiving a shutdown signal (TERM by default) and it sending that signal on to the child process. Designed to give the child process
|
472
472
|
time to complete before being forced to die.
|
473
473
|
|
474
|
-
* `TERM_CHILD` - Must be set for `RESQUE_PRE_SHUTDOWN_TIMEOUT` to be used. After the timeout, if the child is still running it will raise a `
|
474
|
+
* `TERM_CHILD` - Must be set for `RESQUE_PRE_SHUTDOWN_TIMEOUT` to be used. After the timeout, if the child is still running it will raise a `Resque::TermException` and exit.
|
475
475
|
|
476
|
-
* `RESQUE_TERM_TIMEOUT` - By default you have a few seconds to handle `
|
476
|
+
* `RESQUE_TERM_TIMEOUT` - By default you have a few seconds to handle `Resque::TermException` in your job. `RESQUE_TERM_TIMEOUT` and `RESQUE_PRE_SHUTDOWN_TIMEOUT` must be lower than the [heroku dyno timeout](https://devcenter.heroku.com/articles/limits#exit-timeout).
|
477
477
|
|
478
478
|
### Mysql::Error: MySQL server has gone away
|
479
479
|
|
@@ -529,14 +529,14 @@ end
|
|
529
529
|
The Front End
|
530
530
|
-------------
|
531
531
|
|
532
|
-
|
532
|
+
Resque comes with a Sinatra-based front end for seeing what's up with
|
533
533
|
your queue.
|
534
534
|
|
535
535
|
![The Front End](https://camo.githubusercontent.com/64d150a243987ffbc33f588bd6d7722a0bb8d69a/687474703a2f2f7475746f7269616c732e6a756d7073746172746c61622e636f6d2f696d616765732f7265737175655f6f766572766965772e706e67)
|
536
536
|
|
537
537
|
### Standalone
|
538
538
|
|
539
|
-
If you've installed
|
539
|
+
If you've installed Resque as a gem running the front end standalone is easy:
|
540
540
|
|
541
541
|
$ resque-web
|
542
542
|
|
@@ -544,7 +544,7 @@ It's a thin layer around `rackup` so it's configurable as well:
|
|
544
544
|
|
545
545
|
$ resque-web -p 8282
|
546
546
|
|
547
|
-
If you have a
|
547
|
+
If you have a Resque config file you want evaluated just pass it to
|
548
548
|
the script as the final argument:
|
549
549
|
|
550
550
|
$ resque-web -p 8282 rails_root/config/initializers/resque.rb
|
@@ -559,7 +559,7 @@ or set the Redis connection string if you need to do something like select a dif
|
|
559
559
|
|
560
560
|
### Passenger
|
561
561
|
|
562
|
-
Using Passenger?
|
562
|
+
Using Passenger? Resque ships with a `config.ru` you can use. See
|
563
563
|
Phusion's guide:
|
564
564
|
|
565
565
|
Apache: <https://www.phusionpassenger.com/library/deploy/apache/deploy/ruby/>
|
@@ -567,7 +567,7 @@ Nginx: <https://www.phusionpassenger.com/library/deploy/nginx/deploy/ruby/>
|
|
567
567
|
|
568
568
|
### Rack::URLMap
|
569
569
|
|
570
|
-
If you want to load
|
570
|
+
If you want to load Resque on a subpath, possibly alongside other
|
571
571
|
apps, it's easy to do with Rack's `URLMap`:
|
572
572
|
|
573
573
|
``` ruby
|
@@ -575,7 +575,7 @@ require 'resque/server'
|
|
575
575
|
|
576
576
|
run Rack::URLMap.new \
|
577
577
|
"/" => Your::App.new,
|
578
|
-
"/resque" =>
|
578
|
+
"/resque" => Resque::Server.new
|
579
579
|
```
|
580
580
|
|
581
581
|
Check `examples/demo/config.ru` for a functional example (including
|
@@ -583,28 +583,28 @@ HTTP basic auth).
|
|
583
583
|
|
584
584
|
### Rails 3
|
585
585
|
|
586
|
-
You can also mount
|
586
|
+
You can also mount Resque on a subpath in your existing Rails 3 app by adding `require 'resque/server'` to the top of your routes file or in an initializer then adding this to `routes.rb`:
|
587
587
|
|
588
588
|
``` ruby
|
589
|
-
mount
|
589
|
+
mount Resque::Server.new, :at => "/resque"
|
590
590
|
```
|
591
591
|
|
592
592
|
|
593
|
-
|
593
|
+
Resque vs DelayedJob
|
594
594
|
--------------------
|
595
595
|
|
596
|
-
How does
|
596
|
+
How does Resque compare to DelayedJob, and why would you choose one
|
597
597
|
over the other?
|
598
598
|
|
599
|
-
*
|
599
|
+
* Resque supports multiple queues
|
600
600
|
* DelayedJob supports finer grained priorities
|
601
|
-
*
|
601
|
+
* Resque workers are resilient to memory leaks / bloat
|
602
602
|
* DelayedJob workers are extremely simple and easy to modify
|
603
|
-
*
|
603
|
+
* Resque requires Redis
|
604
604
|
* DelayedJob requires ActiveRecord
|
605
|
-
*
|
605
|
+
* Resque can only place JSONable Ruby objects on a queue as arguments
|
606
606
|
* DelayedJob can place _any_ Ruby object on its queue as arguments
|
607
|
-
*
|
607
|
+
* Resque includes a Sinatra app for monitoring what's going on
|
608
608
|
* DelayedJob can be queried from within your Rails app if you want to
|
609
609
|
add an interface
|
610
610
|
|
@@ -612,7 +612,7 @@ If you're doing Rails development, you already have a database and
|
|
612
612
|
ActiveRecord. DelayedJob is super easy to setup and works great.
|
613
613
|
GitHub used it for many months to process almost 200 million jobs.
|
614
614
|
|
615
|
-
Choose
|
615
|
+
Choose Resque if:
|
616
616
|
|
617
617
|
* You need multiple queues
|
618
618
|
* You don't care / dislike numeric priorities
|
@@ -632,17 +632,17 @@ Choose DelayedJob if:
|
|
632
632
|
* You want to easily throw anything on the queue
|
633
633
|
* You don't want to setup Redis
|
634
634
|
|
635
|
-
In no way is
|
635
|
+
In no way is Resque a "better" DelayedJob, so make sure you pick the
|
636
636
|
tool that's best for your app.
|
637
637
|
|
638
|
-
|
638
|
+
Resque Dependencies
|
639
639
|
-------------------
|
640
640
|
|
641
641
|
$ gem install bundler
|
642
642
|
$ bundle install
|
643
643
|
|
644
644
|
|
645
|
-
Installing
|
645
|
+
Installing Resque
|
646
646
|
-----------------
|
647
647
|
|
648
648
|
### In a Rack app, as a gem
|
@@ -661,7 +661,7 @@ Now start your application:
|
|
661
661
|
|
662
662
|
rackup config.ru
|
663
663
|
|
664
|
-
That's it! You can now create
|
664
|
+
That's it! You can now create Resque jobs from within your app.
|
665
665
|
|
666
666
|
To start a worker, create a Rakefile in your app's root (or add this
|
667
667
|
to an existing Rakefile):
|
@@ -701,7 +701,7 @@ Now start your application:
|
|
701
701
|
|
702
702
|
$ ./script/server
|
703
703
|
|
704
|
-
That's it! You can now create
|
704
|
+
That's it! You can now create Resque jobs from within your app.
|
705
705
|
|
706
706
|
To start a worker, add this to your Rakefile in `RAILS_ROOT`:
|
707
707
|
|
@@ -721,7 +721,7 @@ Don't forget you can define a `resque:setup` hook in
|
|
721
721
|
|
722
722
|
$ ./script/plugin install git://github.com/resque/resque
|
723
723
|
|
724
|
-
That's it!
|
724
|
+
That's it! Resque will automatically be available when your Rails app
|
725
725
|
loads.
|
726
726
|
|
727
727
|
To start a worker:
|
@@ -749,7 +749,7 @@ Now start your application:
|
|
749
749
|
|
750
750
|
$ rails server
|
751
751
|
|
752
|
-
That's it! You can now create
|
752
|
+
That's it! You can now create Resque jobs from within your app.
|
753
753
|
|
754
754
|
To start a worker, add this to a file in `lib/tasks` (ex:
|
755
755
|
`lib/tasks/resque.rake`):
|
@@ -769,16 +769,16 @@ Don't forget you can define a `resque:setup` hook in
|
|
769
769
|
Configuration
|
770
770
|
-------------
|
771
771
|
|
772
|
-
You may want to change the Redis host and port
|
772
|
+
You may want to change the Redis host and port Resque connects to, or
|
773
773
|
set various other options at startup.
|
774
774
|
|
775
|
-
|
776
|
-
object. This means if you're already using Redis in your app,
|
775
|
+
Resque has a `redis` setter which can be given a string or a Redis
|
776
|
+
object. This means if you're already using Redis in your app, Resque
|
777
777
|
can re-use the existing connection.
|
778
778
|
|
779
|
-
String: `
|
779
|
+
String: `Resque.redis = 'localhost:6379'`
|
780
780
|
|
781
|
-
Redis: `
|
781
|
+
Redis: `Resque.redis = $redis`
|
782
782
|
|
783
783
|
For our rails app we have a `config/initializers/resque.rb` file where
|
784
784
|
we load `config/resque.yml` by hand and set the Redis information
|
@@ -799,7 +799,7 @@ rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
|
|
799
799
|
rails_env = ENV['RAILS_ENV'] || 'development'
|
800
800
|
|
801
801
|
resque_config = YAML.load_file(rails_root + '/config/resque.yml')
|
802
|
-
|
802
|
+
Resque.redis = resque_config[rails_env]
|
803
803
|
```
|
804
804
|
|
805
805
|
Easy peasy! Why not just use `RAILS_ROOT` and `RAILS_ENV`? Because
|
@@ -813,7 +813,7 @@ Also, you could disable jobs queueing by setting 'inline' attribute.
|
|
813
813
|
For example, if you want to run all jobs in the same process for cucumber, try:
|
814
814
|
|
815
815
|
``` ruby
|
816
|
-
|
816
|
+
Resque.inline = ENV['RAILS_ENV'] == "cucumber"
|
817
817
|
```
|
818
818
|
|
819
819
|
|
@@ -823,26 +823,26 @@ Plugins and Hooks
|
|
823
823
|
For a list of available plugins see
|
824
824
|
<http://wiki.github.com/resque/resque/plugins>.
|
825
825
|
|
826
|
-
If you'd like to write your own plugin, or want to customize
|
827
|
-
using hooks (such as `
|
826
|
+
If you'd like to write your own plugin, or want to customize Resque
|
827
|
+
using hooks (such as `Resque.after_fork`), see
|
828
828
|
[docs/HOOKS.md](http://github.com/resque/resque/blob/master/docs/HOOKS.md).
|
829
829
|
|
830
830
|
|
831
831
|
Namespaces
|
832
832
|
----------
|
833
833
|
|
834
|
-
If you're running multiple, separate instances of
|
834
|
+
If you're running multiple, separate instances of Resque you may want
|
835
835
|
to namespace the keyspaces so they do not overlap. This is not unlike
|
836
836
|
the approach taken by many memcached clients.
|
837
837
|
|
838
838
|
This feature is provided by the [redis-namespace][rs] library, which
|
839
|
-
|
839
|
+
Resque uses by default to separate the keys it manages from other keys
|
840
840
|
in your Redis server.
|
841
841
|
|
842
|
-
Simply use the `
|
842
|
+
Simply use the `Resque.redis.namespace` accessor:
|
843
843
|
|
844
844
|
``` ruby
|
845
|
-
|
845
|
+
Resque.redis.namespace = "resque:GitHub"
|
846
846
|
```
|
847
847
|
|
848
848
|
We recommend sticking this in your initializer somewhere after Redis
|
@@ -852,7 +852,7 @@ is configured.
|
|
852
852
|
Demo
|
853
853
|
----
|
854
854
|
|
855
|
-
|
855
|
+
Resque ships with a demo Sinatra app for creating jobs that are later
|
856
856
|
processed in the background.
|
857
857
|
|
858
858
|
Try it out by looking at the README, found at `examples/demo/README.markdown`.
|
@@ -863,7 +863,7 @@ Monitoring
|
|
863
863
|
|
864
864
|
### god
|
865
865
|
|
866
|
-
If you're using god to monitor
|
866
|
+
If you're using god to monitor Resque, we have provided example
|
867
867
|
configs in `examples/god/`. One is for starting / stopping workers,
|
868
868
|
the other is for killing workers that have been running too long.
|
869
869
|
|
@@ -883,7 +883,7 @@ Please add them to the [FAQ](https://github.com/resque/resque/wiki/FAQ) or open
|
|
883
883
|
Development
|
884
884
|
-----------
|
885
885
|
|
886
|
-
Want to hack on
|
886
|
+
Want to hack on Resque?
|
887
887
|
|
888
888
|
First clone the repo and run the tests:
|
889
889
|
|
@@ -917,7 +917,7 @@ Read [CONTRIBUTING.md](CONTRIBUTING.md) first.
|
|
917
917
|
|
918
918
|
Once you've made your great commits:
|
919
919
|
|
920
|
-
1. [Fork][1]
|
920
|
+
1. [Fork][1] Resque
|
921
921
|
2. Create a topic branch - `git checkout -b my_branch`
|
922
922
|
3. Push to your branch - `git push origin my_branch`
|
923
923
|
4. Create a [Pull Request](http://help.github.com/pull-requests/) from your branch
|
data/Rakefile
CHANGED
data/bin/{resque-admin → resque}
RENAMED
@@ -7,7 +7,7 @@ rescue LoadError
|
|
7
7
|
require 'rubygems'
|
8
8
|
require 'redis-namespace'
|
9
9
|
end
|
10
|
-
require '
|
10
|
+
require 'resque'
|
11
11
|
require 'optparse'
|
12
12
|
|
13
13
|
parser = OptionParser.new do |opts|
|
@@ -17,11 +17,11 @@ parser = OptionParser.new do |opts|
|
|
17
17
|
opts.separator "Options:"
|
18
18
|
|
19
19
|
opts.on("-r", "--redis [HOST:PORT]", "Redis connection string") do |host|
|
20
|
-
|
20
|
+
Resque.redis = host
|
21
21
|
end
|
22
22
|
|
23
23
|
opts.on("-N", "--namespace [NAMESPACE]", "Redis namespace") do |namespace|
|
24
|
-
|
24
|
+
Resque.redis.namespace = namespace
|
25
25
|
end
|
26
26
|
|
27
27
|
opts.on("-h", "--help", "Show this message") do
|
@@ -37,7 +37,7 @@ parser = OptionParser.new do |opts|
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def kill(worker)
|
40
|
-
abort "**
|
40
|
+
abort "** resque kill WORKER_ID" if worker.nil?
|
41
41
|
pid = worker.split(':')[1].to_i
|
42
42
|
|
43
43
|
begin
|
@@ -51,15 +51,15 @@ def kill(worker)
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def remove(worker)
|
54
|
-
abort "**
|
54
|
+
abort "** resque remove WORKER_ID" if worker.nil?
|
55
55
|
|
56
|
-
|
56
|
+
Resque.remove_worker(worker)
|
57
57
|
puts "** removed #{worker}"
|
58
58
|
end
|
59
59
|
|
60
60
|
def list
|
61
|
-
if
|
62
|
-
|
61
|
+
if Resque.workers.any?
|
62
|
+
Resque.workers.each do |worker|
|
63
63
|
puts "#{worker} (#{worker.state})"
|
64
64
|
end
|
65
65
|
else
|
@@ -7,10 +7,10 @@ rescue LoadError
|
|
7
7
|
require 'rubygems'
|
8
8
|
require 'vegas'
|
9
9
|
end
|
10
|
-
require '
|
10
|
+
require 'resque/server'
|
11
11
|
|
12
12
|
|
13
|
-
Vegas::Runner.new(
|
13
|
+
Vegas::Runner.new(Resque::Server, 'resque-web', {
|
14
14
|
:before_run => lambda {|v|
|
15
15
|
path = (ENV['RESQUECONFIG'] || v.args.first)
|
16
16
|
load path.to_s.strip if path
|
@@ -18,14 +18,14 @@ Vegas::Runner.new(ResqueAdmin::Server, 'resque-web', {
|
|
18
18
|
}) do |runner, opts, app|
|
19
19
|
opts.on('-N NAMESPACE', "--namespace NAMESPACE", "set the Redis namespace") {|namespace|
|
20
20
|
runner.logger.info "Using Redis namespace '#{namespace}'"
|
21
|
-
|
21
|
+
Resque.redis.namespace = namespace
|
22
22
|
}
|
23
23
|
opts.on('-r redis-connection', "--redis redis-connection", "set the Redis connection string") {|redis_conf|
|
24
24
|
runner.logger.info "Using Redis connection '#{redis_conf}'"
|
25
|
-
|
25
|
+
Resque.redis = redis_conf
|
26
26
|
}
|
27
27
|
opts.on('-a url-prefix', "--append url-prefix", "set reverse_proxy friendly prefix to links") {|url_prefix|
|
28
28
|
runner.logger.info "Using URL Prefix '#{url_prefix}'"
|
29
|
-
|
29
|
+
Resque::Server.url_prefix = url_prefix
|
30
30
|
}
|
31
31
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
module
|
2
|
-
# An interface between
|
1
|
+
module Resque
|
2
|
+
# An interface between Resque's persistence and the actual
|
3
3
|
# implementation.
|
4
4
|
class DataStore
|
5
5
|
extend Forwardable
|
@@ -53,7 +53,7 @@ module ResqueAdmin
|
|
53
53
|
:increment_stat,
|
54
54
|
:stat
|
55
55
|
|
56
|
-
# Compatibility with any non-
|
56
|
+
# Compatibility with any non-Resque classes that were using Resque.redis as a way to access Redis
|
57
57
|
def method_missing(sym,*args,&block)
|
58
58
|
# TODO: deprecation warning?
|
59
59
|
@redis.send(sym,*args,&block)
|
@@ -82,7 +82,7 @@ module ResqueAdmin
|
|
82
82
|
@redis.client.reconnect
|
83
83
|
end
|
84
84
|
|
85
|
-
# Returns an array of all known
|
85
|
+
# Returns an array of all known Resque keys in Redis. Redis' KEYS operation
|
86
86
|
# is O(N) for the keyspace, so be careful - this can be slow for big databases.
|
87
87
|
def all_resque_keys
|
88
88
|
@redis.keys("*").map do |key|
|