resque-retry 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.md +11 -0
- data/LICENSE +1 -0
- data/README.md +11 -7
- data/Rakefile +1 -1
- data/lib/resque/plugins/exponential_backoff.rb +2 -0
- data/lib/resque/plugins/retry.rb +9 -9
- data/test/retry_test.rb +33 -0
- data/test/test_jobs.rb +1 -0
- metadata +13 -35
data/HISTORY.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
## 0.0.2 (2010-05-06)
|
2
|
+
|
3
|
+
* Bugfix: Were calling non-existent method to delete redis key.
|
4
|
+
* Delay no-longer falls back to `sleep`. resque-scheduler is a required
|
5
|
+
dependancy.
|
6
|
+
* Redis key doesn't include ending colon `:` if no args were passed
|
7
|
+
to the job.
|
8
|
+
|
9
|
+
## 0.0.1 (2010-04-27)
|
10
|
+
|
11
|
+
* First release.
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
resque-retry
|
2
2
|
============
|
3
3
|
|
4
|
-
A [Resque][rq] plugin. Requires Resque 1.8.0
|
4
|
+
A [Resque][rq] plugin. Requires Resque 1.8.0 & [resque-scheduler][rqs]
|
5
5
|
|
6
6
|
resque-retry provides retry, delay and exponential backoff support for
|
7
7
|
resque jobs.
|
@@ -13,10 +13,6 @@ resque jobs.
|
|
13
13
|
- Exponential backoff (varying the delay between retrys).
|
14
14
|
- Small & Extendable - plenty of places to override retry logic/settings.
|
15
15
|
|
16
|
-
**n.b.** [resque-scheduler][rqs] is _really_ recommended if you wish to
|
17
|
-
delay between retry attempts, otherwise your workers will block
|
18
|
-
using `sleep`.
|
19
|
-
|
20
16
|
Usage / Examples
|
21
17
|
----------------
|
22
18
|
|
@@ -33,6 +29,7 @@ Retry the job **once** on failure, with zero delay.
|
|
33
29
|
|
34
30
|
class DeliverWebHook
|
35
31
|
extend Resque::Plugins::Retry
|
32
|
+
@queue = :web_hooks
|
36
33
|
|
37
34
|
def self.perform(url, hook_id, hmac_key)
|
38
35
|
heavy_lifting
|
@@ -47,6 +44,8 @@ determine if we can requeue the job for another go.
|
|
47
44
|
|
48
45
|
class DeliverWebHook
|
49
46
|
extend Resque::Plugins::Retry
|
47
|
+
@queue = :web_hooks
|
48
|
+
|
50
49
|
@retry_limit = 10
|
51
50
|
@retry_delay = 120
|
52
51
|
|
@@ -67,6 +66,7 @@ Use this if you wish to vary the delay between retry attempts:
|
|
67
66
|
|
68
67
|
class DeliverSMS
|
69
68
|
extend Resque::Plugins::ExponentialBackoff
|
69
|
+
@queue = :mt_messages
|
70
70
|
|
71
71
|
def self.perform(mt_id, mobile_number, message)
|
72
72
|
heavy_lifting
|
@@ -93,8 +93,10 @@ it so only specific exceptions are retried using `retry_exceptions`:
|
|
93
93
|
|
94
94
|
class DeliverSMS
|
95
95
|
extend Resque::Plugins::Retry
|
96
|
+
@queue = :mt_messages
|
97
|
+
|
96
98
|
@retry_exceptions = [NetworkError]
|
97
|
-
|
99
|
+
|
98
100
|
def self.perform(mt_id, mobile_number, message)
|
99
101
|
heavy_lifting
|
100
102
|
end
|
@@ -127,6 +129,7 @@ Or you can define the entire key by overriding `redis_retry_key`.
|
|
127
129
|
|
128
130
|
class DeliverSMS
|
129
131
|
extend Resque::Plugins::Retry
|
132
|
+
@queue = :mt_messages
|
130
133
|
|
131
134
|
def self.identifier(mt_id, mobile_number, message)
|
132
135
|
"#{mobile_number}:#{mt_id}"
|
@@ -144,7 +147,8 @@ job arguments, to modify the arguments for the next retry attempt.
|
|
144
147
|
|
145
148
|
class DeliverViaSMSC
|
146
149
|
extend Resque::Plugins::Retry
|
147
|
-
|
150
|
+
@queue = :mt_smsc_messages
|
151
|
+
|
148
152
|
# retry using the emergency SMSC.
|
149
153
|
def self.args_for_retry(smsc_id, mt_message)
|
150
154
|
[999, mt_message]
|
data/Rakefile
CHANGED
@@ -7,6 +7,7 @@ module Resque
|
|
7
7
|
#
|
8
8
|
# class DeliverSMS
|
9
9
|
# extend Resque::Plugins::ExponentialBackoff
|
10
|
+
# @queue = :mt_messages
|
10
11
|
#
|
11
12
|
# def self.perform(mt_id, mobile_number, message)
|
12
13
|
# heavy_lifting
|
@@ -17,6 +18,7 @@ module Resque
|
|
17
18
|
#
|
18
19
|
# class DeliverSMS
|
19
20
|
# extend Resque::Plugins::ExponentialBackoff
|
21
|
+
# @queue = :mt_messages
|
20
22
|
#
|
21
23
|
# @retry_limit = 4
|
22
24
|
#
|
data/lib/resque/plugins/retry.rb
CHANGED
@@ -7,6 +7,7 @@ module Resque
|
|
7
7
|
#
|
8
8
|
# class DeliverWebHook
|
9
9
|
# extend Resque::Plugins::Retry # allows 1 retry by default.
|
10
|
+
# @queue = :web_hooks
|
10
11
|
#
|
11
12
|
# def self.perform(url, hook_id, hmac_key)
|
12
13
|
# heavy_lifting
|
@@ -17,6 +18,7 @@ module Resque
|
|
17
18
|
#
|
18
19
|
# class DeliverWebHook
|
19
20
|
# extend Resque::Plugins::Retry
|
21
|
+
# @queue = :web_hooks
|
20
22
|
#
|
21
23
|
# @retry_limit = 8 # default: 1
|
22
24
|
# @retry_delay = 60 # default: 0
|
@@ -43,7 +45,8 @@ module Resque
|
|
43
45
|
# @param [Array] args job arguments
|
44
46
|
# @return [String] job identifier
|
45
47
|
def identifier(*args)
|
46
|
-
args.join('-')
|
48
|
+
args_string = args.join('-')
|
49
|
+
args_string.empty? ? nil : args_string
|
47
50
|
end
|
48
51
|
|
49
52
|
##
|
@@ -130,15 +133,12 @@ module Resque
|
|
130
133
|
|
131
134
|
##
|
132
135
|
# Will retry the job.
|
133
|
-
#
|
134
|
-
# n.b. If your not using the resque-scheduler plugin your job will block
|
135
|
-
# your worker, while it sleeps for `retry_delay`.
|
136
136
|
def try_again(*args)
|
137
|
-
if
|
138
|
-
|
139
|
-
else
|
140
|
-
sleep(retry_delay) if retry_delay > 0
|
137
|
+
if retry_delay <= 0
|
138
|
+
# If the delay is 0, no point passing it through the scheduler
|
141
139
|
Resque.enqueue(self, *args_for_retry(*args))
|
140
|
+
else
|
141
|
+
Resque.enqueue_in(retry_delay, self, *args_for_retry(*args))
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
@@ -169,7 +169,7 @@ module Resque
|
|
169
169
|
if retry_criteria_valid?(exception, *args)
|
170
170
|
try_again(*args)
|
171
171
|
else
|
172
|
-
|
172
|
+
Resque.redis.del(redis_retry_key(*args))
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
data/test/retry_test.rb
CHANGED
@@ -105,4 +105,37 @@ class RetryTest < Test::Unit::TestCase
|
|
105
105
|
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
106
106
|
end
|
107
107
|
|
108
|
+
def test_delete_redis_key_when_job_is_successful
|
109
|
+
Resque.enqueue(GoodJob, 'arg1')
|
110
|
+
|
111
|
+
assert_equal nil, Resque.redis.get(GoodJob.redis_retry_key('arg1'))
|
112
|
+
perform_next_job(@worker)
|
113
|
+
assert_equal nil, Resque.redis.get(GoodJob.redis_retry_key('arg1'))
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_delete_redis_key_after_final_failed_retry
|
117
|
+
Resque.enqueue(FailFiveTimesJob, 'yarrrr')
|
118
|
+
assert_equal nil, Resque.redis.get(FailFiveTimesJob.redis_retry_key('yarrrr'))
|
119
|
+
|
120
|
+
perform_next_job(@worker)
|
121
|
+
assert_equal '0', Resque.redis.get(FailFiveTimesJob.redis_retry_key('yarrrr'))
|
122
|
+
|
123
|
+
perform_next_job(@worker)
|
124
|
+
assert_equal '1', Resque.redis.get(FailFiveTimesJob.redis_retry_key('yarrrr'))
|
125
|
+
|
126
|
+
5.times do
|
127
|
+
perform_next_job(@worker)
|
128
|
+
end
|
129
|
+
assert_equal nil, Resque.redis.get(FailFiveTimesJob.redis_retry_key('yarrrr'))
|
130
|
+
|
131
|
+
assert_equal 5, Resque.info[:failed], 'failed jobs'
|
132
|
+
assert_equal 6, Resque.info[:processed], 'processed job'
|
133
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_job_without_args_has_no_ending_colon_in_redis_key
|
137
|
+
assert_equal 'resque-retry:GoodJob:yarrrr', GoodJob.redis_retry_key('yarrrr')
|
138
|
+
assert_equal 'resque-retry:GoodJob:foo', GoodJob.redis_retry_key('foo')
|
139
|
+
assert_equal 'resque-retry:GoodJob', GoodJob.redis_retry_key
|
140
|
+
end
|
108
141
|
end
|
data/test/test_jobs.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Luke Antins
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-05-06 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -33,19 +33,21 @@ dependencies:
|
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: resque-scheduler
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ~>
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
segments:
|
43
|
+
- 1
|
44
|
+
- 8
|
43
45
|
- 0
|
44
|
-
version:
|
45
|
-
type: :
|
46
|
+
version: 1.8.0
|
47
|
+
type: :runtime
|
46
48
|
version_requirements: *id002
|
47
49
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
50
|
+
name: turn
|
49
51
|
prerelease: false
|
50
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
51
53
|
requirements:
|
@@ -57,7 +59,7 @@ dependencies:
|
|
57
59
|
type: :development
|
58
60
|
version_requirements: *id003
|
59
61
|
- !ruby/object:Gem::Dependency
|
60
|
-
name:
|
62
|
+
name: yard
|
61
63
|
prerelease: false
|
62
64
|
requirement: &id004 !ruby/object:Gem::Requirement
|
63
65
|
requirements:
|
@@ -68,32 +70,7 @@ dependencies:
|
|
68
70
|
version: "0"
|
69
71
|
type: :development
|
70
72
|
version_requirements: *id004
|
71
|
-
description:
|
72
|
-
A resque plugin; provides retry, delay and exponential backoff support for
|
73
|
-
resque jobs.
|
74
|
-
|
75
|
-
Retry Example:
|
76
|
-
|
77
|
-
require 'resque-retry'
|
78
|
-
|
79
|
-
class DeliverWebHook
|
80
|
-
extend Resque::Plugins::Retry
|
81
|
-
|
82
|
-
def self.perform(url, hook_id, hmac_key)
|
83
|
-
heavy_lifting
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
Exponential Backoff Example:
|
88
|
-
|
89
|
-
class DeliverSMS
|
90
|
-
extend Resque::Plugins::ExponentialBackoff
|
91
|
-
|
92
|
-
def self.perform(mobile_number, message)
|
93
|
-
heavy_lifting
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
73
|
+
description: " resque-retry provides retry, delay and exponential backoff support for\n resque jobs.\n\n Features:\n\n * Redis backed retry count/limit.\n * Retry on all or specific exceptions.\n * Exponential backoff (varying the delay between retrys).\n * Small & Extendable - plenty of places to override retry logic/settings.\n"
|
97
74
|
email: luke@lividpenguin.com
|
98
75
|
executables: []
|
99
76
|
|
@@ -105,6 +82,7 @@ files:
|
|
105
82
|
- LICENSE
|
106
83
|
- Rakefile
|
107
84
|
- README.md
|
85
|
+
- HISTORY.md
|
108
86
|
- test/exponential_backoff_test.rb
|
109
87
|
- test/redis-test.conf
|
110
88
|
- test/resque_test.rb
|