resque-retry 0.0.5 → 0.0.6
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 +4 -0
- data/README.md +30 -0
- data/lib/resque/plugins/exponential_backoff.rb +0 -4
- data/lib/resque/plugins/retry.rb +61 -19
- data/test/exponential_backoff_test.rb +4 -4
- data/test/retry_criteria_test.rb +75 -0
- data/test/retry_inheriting_checks_test.rb +33 -0
- data/test/retry_test.rb +12 -0
- data/test/test_helper.rb +0 -3
- data/test/test_jobs.rb +137 -3
- metadata +5 -3
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -105,6 +105,36 @@ it so only specific exceptions are retried using `retry_exceptions`:
|
|
105
105
|
The above modification will **only** retry if a `NetworkError` (or subclass)
|
106
106
|
exception is thrown.
|
107
107
|
|
108
|
+
### Custom Retry Criteria Check Callbacks
|
109
|
+
|
110
|
+
You may define custom retry criteria callbacks:
|
111
|
+
|
112
|
+
class TurkWorker
|
113
|
+
extend Resque::Plugins::Retry
|
114
|
+
@queue = :turk_job_processor
|
115
|
+
|
116
|
+
@retry_exceptions = [NetworkError]
|
117
|
+
|
118
|
+
retry_criteria_check do |exception, *args|
|
119
|
+
if exception.message =~ /InvalidJobId/
|
120
|
+
false # don't retry if we got passed a invalid job id.
|
121
|
+
else
|
122
|
+
true # its okay for a retry attempt to continue.
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.perform(job_id)
|
127
|
+
heavy_lifting
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
Similar to the previous example, this job will retry if either a
|
132
|
+
`NetworkError` (or subclass) exception is thrown **or** any of the callbacks
|
133
|
+
return true.
|
134
|
+
|
135
|
+
Use `@retry_exceptions = []` to **only** use callbacks, to determine if the
|
136
|
+
job should retry.
|
137
|
+
|
108
138
|
Customise & Extend
|
109
139
|
------------------
|
110
140
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Resque
|
2
2
|
module Plugins
|
3
3
|
|
4
|
-
##
|
5
4
|
# If you want your job to retry on failure using a varying delay, simply
|
6
5
|
# extend your module/class with this module:
|
7
6
|
#
|
@@ -38,7 +37,6 @@ module Resque
|
|
38
37
|
module ExponentialBackoff
|
39
38
|
include Resque::Plugins::Retry
|
40
39
|
|
41
|
-
##
|
42
40
|
# Defaults to the number of delays in the backoff strategy.
|
43
41
|
#
|
44
42
|
# @return [Number] maximum number of retries
|
@@ -46,7 +44,6 @@ module Resque
|
|
46
44
|
@retry_limit ||= backoff_strategy.length
|
47
45
|
end
|
48
46
|
|
49
|
-
##
|
50
47
|
# Selects the delay from the backoff strategy.
|
51
48
|
#
|
52
49
|
# @return [Number] seconds to delay until the next retry.
|
@@ -54,7 +51,6 @@ module Resque
|
|
54
51
|
backoff_strategy[retry_attempt] || backoff_strategy.last
|
55
52
|
end
|
56
53
|
|
57
|
-
##
|
58
54
|
# @abstract
|
59
55
|
# The backoff strategy is used to vary the delay between retry attempts.
|
60
56
|
#
|
data/lib/resque/plugins/retry.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Resque
|
2
2
|
module Plugins
|
3
3
|
|
4
|
-
##
|
5
4
|
# If you want your job to retry on failure, simply extend your module/class
|
6
5
|
# with this module:
|
7
6
|
#
|
@@ -34,7 +33,13 @@ module Resque
|
|
34
33
|
# end
|
35
34
|
#
|
36
35
|
module Retry
|
37
|
-
|
36
|
+
|
37
|
+
# Copy retry criteria checks on inheritance.
|
38
|
+
def inherited(subclass)
|
39
|
+
super(subclass)
|
40
|
+
subclass.instance_variable_set("@retry_criteria_checks", retry_criteria_checks.dup)
|
41
|
+
end
|
42
|
+
|
38
43
|
# @abstract You may override to implement a custom identifier,
|
39
44
|
# you should consider doing this if your job arguments
|
40
45
|
# are many/long or may not cleanly cleanly to strings.
|
@@ -49,7 +54,6 @@ module Resque
|
|
49
54
|
args_string.empty? ? nil : args_string
|
50
55
|
end
|
51
56
|
|
52
|
-
##
|
53
57
|
# Builds the redis key to be used for keeping state of the job
|
54
58
|
# attempts.
|
55
59
|
#
|
@@ -58,7 +62,6 @@ module Resque
|
|
58
62
|
['resque-retry', name, identifier(*args)].compact.join(":").gsub(/\s/, '')
|
59
63
|
end
|
60
64
|
|
61
|
-
##
|
62
65
|
# Maximum number of retrys we can attempt to successfully perform the job.
|
63
66
|
# A retry limit of 0 or below will retry forever.
|
64
67
|
#
|
@@ -67,7 +70,6 @@ module Resque
|
|
67
70
|
@retry_limit ||= 1
|
68
71
|
end
|
69
72
|
|
70
|
-
##
|
71
73
|
# Number of retry attempts used to try and perform the job.
|
72
74
|
#
|
73
75
|
# The real value is kept in Redis, it is accessed and incremented using
|
@@ -78,7 +80,6 @@ module Resque
|
|
78
80
|
@retry_attempt ||= 0
|
79
81
|
end
|
80
82
|
|
81
|
-
##
|
82
83
|
# @abstract
|
83
84
|
# Number of seconds to delay until the job is retried.
|
84
85
|
#
|
@@ -87,7 +88,6 @@ module Resque
|
|
87
88
|
@retry_delay ||= 0
|
88
89
|
end
|
89
90
|
|
90
|
-
##
|
91
91
|
# @abstract
|
92
92
|
# Modify the arguments used to retry the job. Use this to do something
|
93
93
|
# other than try the exact same job again.
|
@@ -97,7 +97,6 @@ module Resque
|
|
97
97
|
args
|
98
98
|
end
|
99
99
|
|
100
|
-
##
|
101
100
|
# Convenience method to test whether you may retry on a given exception.
|
102
101
|
#
|
103
102
|
# @return [Boolean]
|
@@ -106,7 +105,6 @@ module Resque
|
|
106
105
|
!! retry_exceptions.any? { |ex| ex >= exception }
|
107
106
|
end
|
108
107
|
|
109
|
-
##
|
110
108
|
# @abstract
|
111
109
|
# Controls what exceptions may be retried.
|
112
110
|
#
|
@@ -117,21 +115,68 @@ module Resque
|
|
117
115
|
@retry_exceptions ||= nil
|
118
116
|
end
|
119
117
|
|
120
|
-
##
|
121
118
|
# Test if the retry criteria is valid.
|
122
119
|
#
|
123
120
|
# @param [Exception] exception
|
124
121
|
# @param [Array] args job arguments
|
125
122
|
# @return [Boolean]
|
126
123
|
def retry_criteria_valid?(exception, *args)
|
127
|
-
#
|
124
|
+
# if the retry limit was reached, dont bother checking anything else.
|
125
|
+
return false if retry_limit_reached?
|
126
|
+
|
127
|
+
# We always want to retry if the exception matches.
|
128
|
+
should_retry = retry_exception?(exception.class)
|
129
|
+
|
130
|
+
# call user retry criteria check blocks.
|
131
|
+
retry_criteria_checks.each do |criteria_check|
|
132
|
+
should_retry ||= !!criteria_check.call(exception, *args)
|
133
|
+
end
|
134
|
+
|
135
|
+
should_retry
|
136
|
+
end
|
137
|
+
|
138
|
+
# Retry criteria checks.
|
139
|
+
#
|
140
|
+
# @return [Array]
|
141
|
+
def retry_criteria_checks
|
142
|
+
@retry_criteria_checks ||= []
|
143
|
+
@retry_criteria_checks
|
144
|
+
end
|
145
|
+
|
146
|
+
# Test if the retry limit has been reached.
|
147
|
+
#
|
148
|
+
# @return [Boolean]
|
149
|
+
def retry_limit_reached?
|
128
150
|
if retry_limit > 0
|
129
|
-
return
|
151
|
+
return true if retry_attempt >= retry_limit
|
130
152
|
end
|
131
|
-
|
153
|
+
false
|
154
|
+
end
|
155
|
+
|
156
|
+
# Register a retry criteria check callback to be run before retrying
|
157
|
+
# the job again.
|
158
|
+
#
|
159
|
+
# If any callback returns `true`, the job will be retried.
|
160
|
+
#
|
161
|
+
# @example Using a custom retry criteria check.
|
162
|
+
#
|
163
|
+
# retry_criteria_check do |exception, *args|
|
164
|
+
# if exception.message =~ /InvalidJobId/
|
165
|
+
# # don't retry if we got passed a invalid job id.
|
166
|
+
# false
|
167
|
+
# else
|
168
|
+
# true
|
169
|
+
# end
|
170
|
+
# end
|
171
|
+
#
|
172
|
+
# @yield [exception, *args]
|
173
|
+
# @yieldparam exception [Exception] the exception that was raised
|
174
|
+
# @yieldparam args [Array] job arguments
|
175
|
+
# @yieldreturn [Boolean] false == dont retry, true = can retry
|
176
|
+
def retry_criteria_check(&block)
|
177
|
+
retry_criteria_checks << block
|
132
178
|
end
|
133
179
|
|
134
|
-
##
|
135
180
|
# Will retry the job.
|
136
181
|
def try_again(*args)
|
137
182
|
if retry_delay <= 0
|
@@ -142,7 +187,6 @@ module Resque
|
|
142
187
|
end
|
143
188
|
end
|
144
189
|
|
145
|
-
##
|
146
190
|
# Resque before_perform hook.
|
147
191
|
#
|
148
192
|
# Increments and sets the `@retry_attempt` count.
|
@@ -152,7 +196,6 @@ module Resque
|
|
152
196
|
@retry_attempt = Resque.redis.incr(retry_key) # increment by 1.
|
153
197
|
end
|
154
198
|
|
155
|
-
##
|
156
199
|
# Resque after_perform hook.
|
157
200
|
#
|
158
201
|
# Deletes retry attempt count from Redis.
|
@@ -160,7 +203,6 @@ module Resque
|
|
160
203
|
Resque.redis.del(redis_retry_key(*args))
|
161
204
|
end
|
162
205
|
|
163
|
-
##
|
164
206
|
# Resque on_failure hook.
|
165
207
|
#
|
166
208
|
# Checks if our retry criteria is valid, if it is we try again.
|
@@ -172,7 +214,7 @@ module Resque
|
|
172
214
|
Resque.redis.del(redis_retry_key(*args))
|
173
215
|
end
|
174
216
|
end
|
175
|
-
end
|
176
217
|
|
218
|
+
end
|
177
219
|
end
|
178
|
-
end
|
220
|
+
end
|
@@ -38,22 +38,22 @@ class ExponentialBackoffTest < Test::Unit::TestCase
|
|
38
38
|
assert_equal now.to_i + 10_800, delayed[3], '5th delay'
|
39
39
|
assert_equal now.to_i + 21_600, delayed[4], '6th delay'
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def test_custom_backoff_strategy
|
43
43
|
now = Time.now
|
44
44
|
4.times do
|
45
45
|
Resque.enqueue(CustomExponentialBackoffJob, 'http://lividpenguin.com', 1305, 'cd8079192d379dc612f17c660591a6cfb05f1dda')
|
46
46
|
perform_next_job @worker
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
delayed = Resque.delayed_queue_peek(0, 3)
|
50
50
|
assert_equal now.to_i + 10, delayed[0], '1st delay'
|
51
51
|
assert_equal now.to_i + 20, delayed[1], '2nd delay'
|
52
52
|
assert_equal now.to_i + 30, delayed[2], '3rd delay'
|
53
53
|
assert_equal 2, Resque.delayed_timestamp_size(delayed[2]), '4th delay should share delay with 3rd'
|
54
|
-
|
54
|
+
|
55
55
|
assert_equal 4, Resque.info[:processed], 'processed jobs'
|
56
56
|
assert_equal 4, Resque.info[:failed], 'failed jobs'
|
57
57
|
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
58
58
|
end
|
59
|
-
end
|
59
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class RetryCriteriaTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Resque.redis.flushall
|
6
|
+
@worker = Resque::Worker.new(:testing)
|
7
|
+
@worker.register_worker
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_retry_criteria_check_should_retry
|
11
|
+
Resque.enqueue(RetryModuleCustomRetryCriteriaCheck)
|
12
|
+
3.times do
|
13
|
+
perform_next_job(@worker)
|
14
|
+
end
|
15
|
+
|
16
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
17
|
+
assert_equal 2, Resque.info[:failed], 'failed jobs'
|
18
|
+
assert_equal 2, Resque.info[:processed], 'processed job'
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_retry_criteria_check_hierarchy_should_not_retry
|
22
|
+
Resque.enqueue(CustomRetryCriteriaCheckDontRetry)
|
23
|
+
3.times do
|
24
|
+
perform_next_job(@worker)
|
25
|
+
end
|
26
|
+
|
27
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
28
|
+
assert_equal 1, Resque.info[:failed], 'failed jobs'
|
29
|
+
assert_equal 1, Resque.info[:processed], 'processed job'
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_retry_criteria_check_hierarchy_should_retry
|
33
|
+
Resque.enqueue(CustomRetryCriteriaCheckDoRetry)
|
34
|
+
3.times do
|
35
|
+
perform_next_job(@worker)
|
36
|
+
end
|
37
|
+
|
38
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
39
|
+
assert_equal 2, Resque.info[:failed], 'failed jobs'
|
40
|
+
assert_equal 2, Resque.info[:processed], 'processed job'
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_retry_criteria_check_multiple_never_retry
|
44
|
+
Resque.enqueue(CustomRetryCriteriaCheckMultipleFailTwice, 'dont')
|
45
|
+
6.times do
|
46
|
+
perform_next_job(@worker)
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
50
|
+
assert_equal 1, Resque.info[:failed], 'failed jobs'
|
51
|
+
assert_equal 1, Resque.info[:processed], 'processed job'
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_retry_criteria_check_multiple_do_retry
|
55
|
+
Resque.enqueue(CustomRetryCriteriaCheckMultipleFailTwice, 'do')
|
56
|
+
6.times do
|
57
|
+
perform_next_job(@worker)
|
58
|
+
end
|
59
|
+
|
60
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
61
|
+
assert_equal 2, Resque.info[:failed], 'failed jobs'
|
62
|
+
assert_equal 3, Resque.info[:processed], 'processed job'
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_retry_criteria_check_multiple_do_retry_again
|
66
|
+
Resque.enqueue(CustomRetryCriteriaCheckMultipleFailTwice, 'do_again')
|
67
|
+
6.times do
|
68
|
+
perform_next_job(@worker)
|
69
|
+
end
|
70
|
+
|
71
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
72
|
+
assert_equal 2, Resque.info[:failed], 'failed jobs'
|
73
|
+
assert_equal 3, Resque.info[:processed], 'processed job'
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class RetryInheritingChecksTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Resque.redis.flushall
|
6
|
+
@worker = Resque::Worker.new(:testing)
|
7
|
+
@worker.register_worker
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_default_job_has_one_exception
|
11
|
+
assert_equal 0, RetryDefaultsJob.retry_criteria_checks.size
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_inheriting_copies_exceptions
|
15
|
+
assert_equal RetryDefaultsJob.retry_criteria_checks, InheritTestJob.retry_criteria_checks
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_inheriting_adds_exceptions
|
19
|
+
assert_equal 1, InheritTestWithExtraJob.retry_criteria_checks.size
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_extending_with_resque_retry_doesnt_override_previously_defined_inherited_hook
|
23
|
+
klass = InheritOrderingJobExtendLastSubclass
|
24
|
+
assert_equal 1, klass.retry_criteria_checks.size
|
25
|
+
assert_equal 'test', klass.test_value
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_extending_with_resque_retry_then_defining_inherited_does_not_override_previous_hook
|
29
|
+
klass = InheritOrderingJobExtendFirstSubclass
|
30
|
+
assert_equal 1, klass.retry_criteria_checks.size
|
31
|
+
assert_equal 'test', klass.test_value
|
32
|
+
end
|
33
|
+
end
|
data/test/retry_test.rb
CHANGED
@@ -31,6 +31,17 @@ class RetryTest < Test::Unit::TestCase
|
|
31
31
|
assert_equal 2, Resque.info[:processed], 'processed job'
|
32
32
|
end
|
33
33
|
|
34
|
+
def test_module_retry_defaults
|
35
|
+
Resque.enqueue(RetryModuleDefaultsJob)
|
36
|
+
3.times do
|
37
|
+
perform_next_job(@worker)
|
38
|
+
end
|
39
|
+
|
40
|
+
assert_equal 0, Resque.info[:pending], 'pending jobs'
|
41
|
+
assert_equal 2, Resque.info[:failed], 'failed jobs'
|
42
|
+
assert_equal 2, Resque.info[:processed], 'processed job'
|
43
|
+
end
|
44
|
+
|
34
45
|
def test_job_args_are_maintained
|
35
46
|
test_args = ['maiow', 'cat', [42, 84]]
|
36
47
|
|
@@ -142,4 +153,5 @@ class RetryTest < Test::Unit::TestCase
|
|
142
153
|
def test_redis_retry_key_removes_whitespace
|
143
154
|
assert_equal 'resque-retry:GoodJob:arg1-removespace', GoodJob.redis_retry_key('arg1', 'remove space')
|
144
155
|
end
|
156
|
+
|
145
157
|
end
|
data/test/test_helper.rb
CHANGED
@@ -10,7 +10,6 @@ require 'resque-retry'
|
|
10
10
|
require dir + '/test_jobs'
|
11
11
|
|
12
12
|
|
13
|
-
##
|
14
13
|
# make sure we can run redis
|
15
14
|
if !system("which redis-server")
|
16
15
|
puts '', "** can't find `redis-server` in your path"
|
@@ -19,7 +18,6 @@ if !system("which redis-server")
|
|
19
18
|
end
|
20
19
|
|
21
20
|
|
22
|
-
##
|
23
21
|
# start our own redis when the tests start,
|
24
22
|
# kill it when they end
|
25
23
|
at_exit do
|
@@ -42,7 +40,6 @@ puts "Starting redis for testing at localhost:9736..."
|
|
42
40
|
`redis-server #{dir}/redis-test.conf`
|
43
41
|
Resque.redis = '127.0.0.1:9736'
|
44
42
|
|
45
|
-
##
|
46
43
|
# Test helpers
|
47
44
|
class Test::Unit::TestCase
|
48
45
|
def perform_next_job(worker, &block)
|
data/test/test_jobs.rb
CHANGED
@@ -18,6 +18,25 @@ class RetryDefaultsJob
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
class InheritTestJob < RetryDefaultsJob
|
22
|
+
end
|
23
|
+
|
24
|
+
class InheritTestWithExtraJob < InheritTestJob
|
25
|
+
retry_criteria_check do |exception, *args|
|
26
|
+
false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class InheritTestWithMoreExtraJob < InheritTestWithExtraJob
|
31
|
+
retry_criteria_check do |exception, *args|
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
35
|
+
retry_criteria_check do |exception, *args|
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
21
40
|
class RetryWithModifiedArgsJob < RetryDefaultsJob
|
22
41
|
@queue = :testing
|
23
42
|
|
@@ -48,10 +67,10 @@ end
|
|
48
67
|
class CustomExponentialBackoffJob
|
49
68
|
extend Resque::Plugins::ExponentialBackoff
|
50
69
|
@queue = :testing
|
51
|
-
|
70
|
+
|
52
71
|
@retry_limit = 4
|
53
72
|
@backoff_strategy = [10, 20, 30]
|
54
|
-
|
73
|
+
|
55
74
|
def self.perform(url, hook_id, hmac_key)
|
56
75
|
raise
|
57
76
|
end
|
@@ -71,4 +90,119 @@ class RetryCustomExceptionsJob < RetryDefaultsJob
|
|
71
90
|
else raise StandardError
|
72
91
|
end
|
73
92
|
end
|
74
|
-
end
|
93
|
+
end
|
94
|
+
|
95
|
+
module RetryModuleDefaultsJob
|
96
|
+
extend Resque::Plugins::Retry
|
97
|
+
@queue = :testing
|
98
|
+
|
99
|
+
def self.perform(*args)
|
100
|
+
raise
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
module RetryModuleCustomRetryCriteriaCheck
|
105
|
+
extend Resque::Plugins::Retry
|
106
|
+
@queue = :testing
|
107
|
+
|
108
|
+
# make sure the retry exceptions check will return false.
|
109
|
+
@retry_exceptions = [CustomException]
|
110
|
+
|
111
|
+
retry_criteria_check do |exception, *args|
|
112
|
+
true
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.perform(*args)
|
116
|
+
raise
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
class CustomRetryCriteriaCheckDontRetry < RetryDefaultsJob
|
121
|
+
@queue = :testing
|
122
|
+
|
123
|
+
# make sure the retry exceptions check will return false.
|
124
|
+
@retry_exceptions = [CustomException]
|
125
|
+
|
126
|
+
retry_criteria_check do |exception, *args|
|
127
|
+
false
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class CustomRetryCriteriaCheckDoRetry < CustomRetryCriteriaCheckDontRetry
|
132
|
+
@queue = :testing
|
133
|
+
|
134
|
+
# make sure the retry exceptions check will return false.
|
135
|
+
@retry_exceptions = [CustomException]
|
136
|
+
|
137
|
+
retry_criteria_check do |exception, *args|
|
138
|
+
true
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# A job using multiple custom retry criteria checks.
|
143
|
+
# It always fails 2 times.
|
144
|
+
class CustomRetryCriteriaCheckMultipleFailTwice
|
145
|
+
extend Resque::Plugins::Retry
|
146
|
+
@retry_limit = 6
|
147
|
+
@queue = :testing
|
148
|
+
|
149
|
+
# make sure we dont retry due to default exception behaviour.
|
150
|
+
@retry_exceptions = []
|
151
|
+
|
152
|
+
retry_criteria_check do |exception, *args|
|
153
|
+
exception.message == 'dont' ? false : true
|
154
|
+
end
|
155
|
+
|
156
|
+
retry_criteria_check do |exception, *args|
|
157
|
+
exception.message == 'do' ? true : false
|
158
|
+
end
|
159
|
+
|
160
|
+
retry_criteria_check do |exception, *args|
|
161
|
+
exception.message == 'do_again' ? true : false
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.perform(msg)
|
165
|
+
if retry_attempt < 2 # always fail twice please.
|
166
|
+
raise StandardError, msg
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# A job to test whether self.inherited is respected
|
172
|
+
# when added by other modules.
|
173
|
+
class InheritOrderingJobExtendFirst
|
174
|
+
extend Resque::Plugins::Retry
|
175
|
+
|
176
|
+
retry_criteria_check do |exception, *args|
|
177
|
+
false
|
178
|
+
end
|
179
|
+
|
180
|
+
class << self
|
181
|
+
attr_accessor :test_value
|
182
|
+
end
|
183
|
+
|
184
|
+
def self.inherited(subclass)
|
185
|
+
super(subclass)
|
186
|
+
subclass.test_value = 'test'
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class InheritOrderingJobExtendLast
|
191
|
+
class << self
|
192
|
+
attr_accessor :test_value
|
193
|
+
end
|
194
|
+
|
195
|
+
def self.inherited(subclass)
|
196
|
+
super(subclass)
|
197
|
+
subclass.test_value = 'test'
|
198
|
+
end
|
199
|
+
|
200
|
+
extend Resque::Plugins::Retry
|
201
|
+
|
202
|
+
retry_criteria_check do |exception, *args|
|
203
|
+
false
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
class InheritOrderingJobExtendFirstSubclass < InheritOrderingJobExtendFirst; end
|
208
|
+
class InheritOrderingJobExtendLastSubclass < InheritOrderingJobExtendLast; end
|
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
|
+
- 6
|
9
|
+
version: 0.0.6
|
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-07-12 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +86,8 @@ files:
|
|
86
86
|
- test/exponential_backoff_test.rb
|
87
87
|
- test/redis-test.conf
|
88
88
|
- test/resque_test.rb
|
89
|
+
- test/retry_criteria_test.rb
|
90
|
+
- test/retry_inheriting_checks_test.rb
|
89
91
|
- test/retry_test.rb
|
90
92
|
- test/test_helper.rb
|
91
93
|
- test/test_jobs.rb
|