resque-uniq 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/Gemfile +2 -0
- data/README.md +32 -0
- data/lib/resque/plugins/unique_job.rb +7 -2
- data/lib/resque-uniq/version.rb +1 -1
- data/test/unique_job_test.rb +40 -0
- metadata +6 -3
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -54,6 +54,38 @@ You can tell _resque-uniq_ to auto-expire job locks by setting `@unique_lock_aut
|
|
54
54
|
|
55
55
|
Lock autoexpiration was necessary to protect against stale locks. With the new run lock trick you probably don't need it anymore.
|
56
56
|
|
57
|
+
If you want to define a default `unique_lock_autoexpire` in the base class and let other jobs to extend that base class
|
58
|
+
you cannot use `@unique_lock_autoexpire` since it's not inherited by subclasses. Define a class method with the same
|
59
|
+
name instead
|
60
|
+
|
61
|
+
class BaseJob
|
62
|
+
extend Resque::Plugins::UniqueJob
|
63
|
+
|
64
|
+
def self.queue
|
65
|
+
:default_queue
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.unique_lock_autoexpire
|
69
|
+
600 # TTL = 10 minutes
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class SmallJob < BaseJob
|
74
|
+
def self.perform
|
75
|
+
...
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class BiglJob < BaseJob
|
80
|
+
def self.unique_lock_autoexpire
|
81
|
+
3 * 3600 # TTL = 3 hours
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.perform
|
85
|
+
...
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
57
89
|
## Credits
|
58
90
|
|
59
91
|
There are several similar Resque plugins. We tried them all but for one reason or another they didn't work reliably
|
@@ -46,8 +46,9 @@ module Resque
|
|
46
46
|
Resque.redis.del "#{RUN_LOCK_NAME_PREFIX}#{lock_name}"
|
47
47
|
end
|
48
48
|
nx = Resque.redis.setnx(lock_name, Time.now.to_i)
|
49
|
-
|
50
|
-
|
49
|
+
ttl = instance_variable_get(:@unique_lock_autoexpire) || respond_to?(:unique_lock_autoexpire) && unique_lock_autoexpire
|
50
|
+
if ttl && ttl > 0
|
51
|
+
Resque.redis.expire(lock_name, ttl)
|
51
52
|
end
|
52
53
|
nx
|
53
54
|
end
|
@@ -64,6 +65,10 @@ module Resque
|
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
68
|
+
def after_dequeue_lock(*args)
|
69
|
+
Resque.redis.del(run_lock(*args))
|
70
|
+
Resque.redis.del(lock(*args))
|
71
|
+
end
|
67
72
|
|
68
73
|
private
|
69
74
|
|
data/lib/resque-uniq/version.rb
CHANGED
data/test/unique_job_test.rb
CHANGED
@@ -16,6 +16,15 @@ class UniqueJobTest < Test::Unit::TestCase
|
|
16
16
|
def self.perform(param) ; end
|
17
17
|
end
|
18
18
|
|
19
|
+
class AutoexpireLockJobBase
|
20
|
+
extend Resque::Plugins::UniqueJob
|
21
|
+
def self.queue ; :job_test ; end
|
22
|
+
def self.unique_lock_autoexpire ; 1 ; end
|
23
|
+
def self.perform(param) ; end
|
24
|
+
end
|
25
|
+
|
26
|
+
class ExtendedAutoExpireLockJob < AutoexpireLockJobBase ; end
|
27
|
+
|
19
28
|
def setup
|
20
29
|
Resque.remove_queue(Resque.queue_from_class(Job))
|
21
30
|
Resque.redis.keys('*:UniqueJobTest::*').each {|k| Resque.redis.del(k) }
|
@@ -45,6 +54,30 @@ class UniqueJobTest < Test::Unit::TestCase
|
|
45
54
|
assert_equal 1, Resque.size(queue)
|
46
55
|
end
|
47
56
|
|
57
|
+
def test_lock_is_removed_after_dequeue
|
58
|
+
queue = Resque.queue_from_class(Job)
|
59
|
+
Resque.enqueue(Job, "hello")
|
60
|
+
assert_equal 1, Resque.size(queue)
|
61
|
+
|
62
|
+
Resque.dequeue(Job, "hello")
|
63
|
+
assert_equal 0, Resque.size(queue)
|
64
|
+
assert_equal nil, Resque.redis.get(Job.lock("hello"))
|
65
|
+
assert_equal nil, Resque.redis.get(Job.run_lock("hello"))
|
66
|
+
|
67
|
+
Resque.enqueue(Job, "hello")
|
68
|
+
assert_equal 1, Resque.size(queue)
|
69
|
+
end
|
70
|
+
|
71
|
+
# XXX Resque doesn't call any job hooks in Resque#remove_queue. We don't get a chance to clean up the locks
|
72
|
+
# def test_lock_is_removed_after_remove_queue
|
73
|
+
# queue = Resque.queue_from_class(Job)
|
74
|
+
# Resque.enqueue(Job, "hello")
|
75
|
+
# assert_equal 1, Resque.size(queue)
|
76
|
+
|
77
|
+
# Resque.remove_queue(queue)
|
78
|
+
# assert_equal nil, Resque.redis.get(Job.lock("hello"))
|
79
|
+
# assert_equal nil, Resque.redis.get(Job.run_lock("hello"))
|
80
|
+
# end
|
48
81
|
|
49
82
|
def test_autoexpire_lock
|
50
83
|
Resque.enqueue(AutoexpireLockJob, 123)
|
@@ -53,4 +86,11 @@ class UniqueJobTest < Test::Unit::TestCase
|
|
53
86
|
assert_equal 2, Resque.size(Resque.queue_from_class(AutoexpireLockJob))
|
54
87
|
end
|
55
88
|
|
89
|
+
def test_extended_autoexpire_lock
|
90
|
+
Resque.enqueue(ExtendedAutoExpireLockJob, 123)
|
91
|
+
sleep 2
|
92
|
+
Resque.enqueue(ExtendedAutoExpireLockJob, 123)
|
93
|
+
assert_equal 2, Resque.size(Resque.queue_from_class(ExtendedAutoExpireLockJob))
|
94
|
+
end
|
95
|
+
|
56
96
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-uniq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-17 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -43,13 +43,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
43
43
|
version: '0'
|
44
44
|
segments:
|
45
45
|
- 0
|
46
|
-
hash:
|
46
|
+
hash: -1891980449315157063
|
47
47
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
48
|
none: false
|
49
49
|
requirements:
|
50
50
|
- - ! '>='
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '0'
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
hash: -1891980449315157063
|
53
56
|
requirements: []
|
54
57
|
rubyforge_project:
|
55
58
|
rubygems_version: 1.8.24
|