sidekiq-middleware 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/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/README.md +34 -24
- data/Rakefile +7 -0
- data/lib/sidekiq-middleware.rb +3 -1
- data/lib/sidekiq-middleware/client/unique_jobs.rb +1 -4
- data/lib/sidekiq-middleware/middleware.rb +14 -0
- data/lib/sidekiq-middleware/server/unique_jobs.rb +1 -2
- data/lib/sidekiq-middleware/version.rb +1 -1
- data/sidekiq-middleware.gemspec +3 -1
- data/test/helper.rb +17 -0
- data/test/test_unique_jobs.rb +69 -0
- metadata +47 -3
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
# Additional sidekiq middleware
|
1
|
+
# Additional sidekiq middleware [](http://travis-ci.org/krasnoukhov/sidekiq-middleware)
|
2
2
|
|
3
3
|
This gem provides additional middleware for [Sidekiq](github.com/mperham/sidekiq/).
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
* UniqueJobs (both client and server)
|
5
|
+
See [Sidekiq Wiki](https://github.com/mperham/sidekiq/wiki/Middleware) for more details.
|
8
6
|
|
9
7
|
## Installation
|
10
8
|
|
@@ -20,26 +18,38 @@ Or install it yourself as:
|
|
20
18
|
|
21
19
|
$ gem install sidekiq-middleware
|
22
20
|
|
23
|
-
##
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
21
|
+
## Contents
|
22
|
+
|
23
|
+
### UniqueJobs
|
24
|
+
|
25
|
+
Provides uniqueness for jobs.
|
26
|
+
|
27
|
+
**Usage**
|
28
|
+
|
29
|
+
Example worker:
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
class UniqueWorker
|
33
|
+
include Sidekiq::Worker
|
34
|
+
|
35
|
+
sidekiq_options({
|
36
|
+
# Should be set to true (enables uniqueness for async jobs)
|
37
|
+
# or :all (enables uniqueness for both async and scheduled jobs)
|
38
|
+
unique: :all,
|
39
|
+
|
40
|
+
# Set this to true in case your job schedules itself
|
41
|
+
forever: true,
|
42
|
+
|
43
|
+
# Unique expiration (optional, default is 30 minutes)
|
44
|
+
# For scheduled jobs calculates automatically if not provided
|
45
|
+
expiration: 24 * 60 * 60
|
46
|
+
})
|
47
|
+
|
48
|
+
def perform
|
49
|
+
# Your code goes here
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
43
53
|
|
44
54
|
## Contributing
|
45
55
|
|
data/Rakefile
CHANGED
data/lib/sidekiq-middleware.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'digest'
|
2
|
-
|
3
1
|
module Sidekiq
|
4
2
|
module Middleware
|
5
3
|
module Client
|
@@ -18,13 +16,12 @@ module Sidekiq
|
|
18
16
|
payload = item.clone
|
19
17
|
payload.delete('at')
|
20
18
|
payload.delete('jid')
|
21
|
-
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
22
19
|
else
|
23
20
|
expiration = worker_class.get_sidekiq_options['expiration'] || HASH_KEY_EXPIRATION
|
24
21
|
payload = item.clone
|
25
22
|
payload.delete('jid')
|
26
|
-
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
27
23
|
end
|
24
|
+
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
28
25
|
|
29
26
|
Sidekiq.redis do |conn|
|
30
27
|
conn.watch(payload_hash)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Sidekiq.configure_server do |config|
|
2
|
+
config.server_middleware do |chain|
|
3
|
+
chain.add Sidekiq::Middleware::Server::UniqueJobs
|
4
|
+
end
|
5
|
+
config.client_middleware do |chain|
|
6
|
+
chain.add Sidekiq::Middleware::Client::UniqueJobs
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Sidekiq.configure_client do |config|
|
11
|
+
config.client_middleware do |chain|
|
12
|
+
chain.add Sidekiq::Middleware::Client::UniqueJobs
|
13
|
+
end
|
14
|
+
end
|
@@ -25,12 +25,11 @@ module Sidekiq
|
|
25
25
|
payload = item.clone
|
26
26
|
payload.delete('at')
|
27
27
|
payload.delete('jid')
|
28
|
-
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
29
28
|
else
|
30
29
|
payload = item.clone
|
31
30
|
payload.delete('jid')
|
32
|
-
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
33
31
|
end
|
32
|
+
payload_hash = Digest::MD5.hexdigest(Sidekiq.dump_json(Hash[payload.sort]))
|
34
33
|
|
35
34
|
Sidekiq.redis { |conn| conn.del(payload_hash) }
|
36
35
|
end
|
data/sidekiq-middleware.gemspec
CHANGED
@@ -14,5 +14,7 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.require_paths = ["lib"]
|
15
15
|
gem.version = Sidekiq::Middleware::VERSION
|
16
16
|
|
17
|
-
gem.add_dependency
|
17
|
+
gem.add_dependency 'sidekiq'
|
18
|
+
gem.add_development_dependency 'rake'
|
19
|
+
gem.add_development_dependency 'minitest', '~> 3'
|
18
20
|
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
ENV['RACK_ENV'] = ENV['RAILS_ENV'] = 'test'
|
2
|
+
if ENV.has_key?('SIMPLECOV')
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'minitest/unit'
|
8
|
+
require 'minitest/pride'
|
9
|
+
require 'minitest/autorun'
|
10
|
+
|
11
|
+
require 'sidekiq'
|
12
|
+
require 'sidekiq/util'
|
13
|
+
require 'sidekiq-middleware'
|
14
|
+
Sidekiq.logger.level = Logger::ERROR
|
15
|
+
|
16
|
+
require 'sidekiq/redis_connection'
|
17
|
+
REDIS = Sidekiq::RedisConnection.create(:url => "redis://localhost/15", :namespace => 'testy')
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'helper'
|
3
|
+
require 'sidekiq/client'
|
4
|
+
require 'sidekiq/worker'
|
5
|
+
require 'sidekiq/processor'
|
6
|
+
require 'sidekiq-middleware'
|
7
|
+
|
8
|
+
class TestUniqueJobs < MiniTest::Unit::TestCase
|
9
|
+
describe 'with real redis' do
|
10
|
+
before do
|
11
|
+
@boss = MiniTest::Mock.new
|
12
|
+
@processor = ::Sidekiq::Processor.new(@boss)
|
13
|
+
Celluloid.logger = nil
|
14
|
+
|
15
|
+
Sidekiq.redis = REDIS
|
16
|
+
Sidekiq.redis {|c| c.flushdb }
|
17
|
+
end
|
18
|
+
|
19
|
+
class UniqueWorker
|
20
|
+
include Sidekiq::Worker
|
21
|
+
sidekiq_options queue: :unique_queue, unique: true
|
22
|
+
|
23
|
+
def perform(x)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'does not duplicate messages with enabled unique option' do
|
28
|
+
5.times { UniqueWorker.perform_async('args') }
|
29
|
+
assert_equal 1, Sidekiq.redis { |c| c.llen('queue:unique_queue') }
|
30
|
+
end
|
31
|
+
|
32
|
+
class NotUniqueWorker
|
33
|
+
include Sidekiq::Worker
|
34
|
+
sidekiq_options queue: :not_unique_queue, unique: false
|
35
|
+
|
36
|
+
def perform(x)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'duplicates messages with disabled unique option' do
|
41
|
+
5.times { NotUniqueWorker.perform_async('args') }
|
42
|
+
assert_equal 5, Sidekiq.redis { |c| c.llen('queue:not_unique_queue') }
|
43
|
+
end
|
44
|
+
|
45
|
+
class UniqueScheduledWorker
|
46
|
+
include Sidekiq::Worker
|
47
|
+
sidekiq_options queue: :unique_scheduled_queue, unique: :all, forever: true
|
48
|
+
|
49
|
+
def perform(x)
|
50
|
+
UniqueScheduledWorker.perform_in(60, x)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'does not duplicate scheduled messages with enabled unique option' do
|
55
|
+
5.times { |t| UniqueScheduledWorker.perform_in((t+1)*60, 'args') }
|
56
|
+
assert_equal 1, Sidekiq.redis { |c| c.zrangebyscore('schedule', '-inf', '+inf').length }
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'once schedules job in future with enabled forever option' do
|
60
|
+
5.times {
|
61
|
+
msg = Sidekiq.dump_json({ 'class' => UniqueScheduledWorker.to_s, 'args' => ['forever'] })
|
62
|
+
@boss.expect(:processor_done!, nil, [@processor])
|
63
|
+
@processor.process(msg, 'default')
|
64
|
+
@boss.verify
|
65
|
+
}
|
66
|
+
assert_equal 1, Sidekiq.redis { |c| c.zrangebyscore('schedule', '-inf', '+inf').length }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-middleware
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
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-
|
12
|
+
date: 2012-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: minitest
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3'
|
30
62
|
description: Additional sidekiq middleware
|
31
63
|
email:
|
32
64
|
- dmitry@krasnoukhov.com
|
@@ -35,15 +67,19 @@ extensions: []
|
|
35
67
|
extra_rdoc_files: []
|
36
68
|
files:
|
37
69
|
- .gitignore
|
70
|
+
- .travis.yml
|
38
71
|
- Gemfile
|
39
72
|
- LICENSE
|
40
73
|
- README.md
|
41
74
|
- Rakefile
|
42
75
|
- lib/sidekiq-middleware.rb
|
43
76
|
- lib/sidekiq-middleware/client/unique_jobs.rb
|
77
|
+
- lib/sidekiq-middleware/middleware.rb
|
44
78
|
- lib/sidekiq-middleware/server/unique_jobs.rb
|
45
79
|
- lib/sidekiq-middleware/version.rb
|
46
80
|
- sidekiq-middleware.gemspec
|
81
|
+
- test/helper.rb
|
82
|
+
- test/test_unique_jobs.rb
|
47
83
|
homepage: http://github.com/krasnoukhov/sidekiq-middleware
|
48
84
|
licenses: []
|
49
85
|
post_install_message:
|
@@ -56,16 +92,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
92
|
- - ! '>='
|
57
93
|
- !ruby/object:Gem::Version
|
58
94
|
version: '0'
|
95
|
+
segments:
|
96
|
+
- 0
|
97
|
+
hash: -2849267342138572133
|
59
98
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
99
|
none: false
|
61
100
|
requirements:
|
62
101
|
- - ! '>='
|
63
102
|
- !ruby/object:Gem::Version
|
64
103
|
version: '0'
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
hash: -2849267342138572133
|
65
107
|
requirements: []
|
66
108
|
rubyforge_project:
|
67
109
|
rubygems_version: 1.8.24
|
68
110
|
signing_key:
|
69
111
|
specification_version: 3
|
70
112
|
summary: Additional sidekiq middleware
|
71
|
-
test_files:
|
113
|
+
test_files:
|
114
|
+
- test/helper.rb
|
115
|
+
- test/test_unique_jobs.rb
|