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.
@@ -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
@@ -1,4 +1,5 @@
1
1
  Copyright (c) 2010 Luke Antins
2
+ Copyright (c) 2010 Ryan Carver
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining
4
5
  a copy of this software and associated documentation files (the
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
@@ -21,5 +21,5 @@ YARD::Rake::YardocTask.new :yardoc do |t|
21
21
  t.options = ['--output-dir', "doc/",
22
22
  '--files', 'LICENSE',
23
23
  '--readme', 'README.md',
24
- '--title', 'resque-exponential-backoff documentation']
24
+ '--title', 'resque-retry documentation']
25
25
  end
@@ -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
  #
@@ -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 Resque.respond_to?(:enqueue_in) && retry_delay > 0
138
- Resque.enqueue_in(retry_delay, self, *args_for_retry(*args))
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
- delete_retry_redis_key(*args)
172
+ Resque.redis.del(redis_retry_key(*args))
173
173
  end
174
174
  end
175
175
  end
@@ -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
@@ -3,6 +3,7 @@ HierarchyCustomException = Class.new(CustomException)
3
3
  AnotherCustomException = Class.new(StandardError)
4
4
 
5
5
  class GoodJob
6
+ extend Resque::Plugins::Retry
6
7
  @queue = :testing
7
8
  def self.perform(*args)
8
9
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
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-04-27 00:00:00 +01:00
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: turn
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: "0"
45
- type: :development
46
+ version: 1.8.0
47
+ type: :runtime
46
48
  version_requirements: *id002
47
49
  - !ruby/object:Gem::Dependency
48
- name: yard
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: resque-scheduler
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