resque-retry 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|