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.
@@ -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