sidekiq-dynamic-queues 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +7 -0
- data/lib/sidekiq/dynamic_queues/attributes.rb +7 -7
- data/lib/sidekiq/dynamic_queues/server.rb +1 -1
- data/lib/sidekiq/dynamic_queues/server/views/dynamicqueue.erb +77 -0
- data/lib/sidekiq/dynamic_queues/version.rb +1 -1
- data/sidekiq-dynamic-queues.gemspec +1 -0
- data/spec/queues_spec.rb +2 -3
- data/spec/server_spec.rb +4 -4
- data/spec/spec_helper.rb +8 -13
- metadata +56 -63
- data/lib/sidekiq/dynamic_queues/server/views/dynamicqueue.slim +0 -63
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e26d8799284d819ada2b3525662f535823158eda
|
4
|
+
data.tar.gz: 4c8675472a38536c7e6c94ef7ed784efe7a9319e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: afee84bcaa102dfa32571f8581058e2255cda9567a747fcfb151c82200814039aeab9611440af2ccf64d7c0218a97c4c8f077d6a636acf988b969e01e3f39c1d
|
7
|
+
data.tar.gz: c5c9f306121ab9560c64d8e540448efe6fdcfb0bce1a26468169cfd57b07b5261553f6cd54d1e01cd96deae3870aa746c0a892fc676b7de8c9e0bc903c9a194e
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
0.6.0 (03/04/2014)
|
2
|
+
------------------
|
3
|
+
|
4
|
+
Merge pull request #3 from adstage-david/master <c1f77c5> [Matt Conway]
|
5
|
+
Use Sidekiq::Queue.all instead of deprecated registered_queues. <e01c6b0> [David Haslem]
|
6
|
+
updated for latest sidekiq: slim -> erb, fix running of jobs in tests <eb7f982> [Matt Conway]
|
7
|
+
|
1
8
|
0.5.6 (06/13/2013)
|
2
9
|
------------------
|
3
10
|
|
@@ -10,12 +10,12 @@ module Sidekiq
|
|
10
10
|
def json_encode(data)
|
11
11
|
Sidekiq.dump_json(data)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def json_decode(data)
|
15
15
|
return nil unless data
|
16
16
|
Sidekiq.load_json(data)
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def get_dynamic_queue(key, fallback=['*'])
|
20
20
|
data = Sidekiq.redis {|r| r.hget(DYNAMIC_QUEUE_KEY, key) }
|
21
21
|
queue_names = json_decode(data)
|
@@ -24,7 +24,7 @@ module Sidekiq
|
|
24
24
|
data = Sidekiq.redis {|r| r.hget(DYNAMIC_QUEUE_KEY, FALLBACK_KEY) }
|
25
25
|
queue_names = json_decode(data)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
if queue_names.nil? || queue_names.size == 0
|
29
29
|
queue_names = fallback
|
30
30
|
end
|
@@ -39,7 +39,7 @@ module Sidekiq
|
|
39
39
|
Sidekiq.redis {|r| r.hset(DYNAMIC_QUEUE_KEY, key, json_encode(values)) }
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def set_dynamic_queues(dynamic_queues)
|
44
44
|
Sidekiq.redis do |r|
|
45
45
|
r.multi do
|
@@ -58,7 +58,7 @@ module Sidekiq
|
|
58
58
|
result[FALLBACK_KEY] ||= ['*']
|
59
59
|
return result
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# Returns a list of queues to use when searching for a job.
|
63
63
|
#
|
64
64
|
# A splat ("*") means you want every queue (in alpha order) - this
|
@@ -76,7 +76,7 @@ module Sidekiq
|
|
76
76
|
def expand_queues(queues)
|
77
77
|
queue_names = queues.dup
|
78
78
|
|
79
|
-
real_queues = Sidekiq::
|
79
|
+
real_queues = Sidekiq::Queue.all.map(&:name)
|
80
80
|
matched_queues = []
|
81
81
|
|
82
82
|
while q = queue_names.shift
|
@@ -113,6 +113,6 @@ module Sidekiq
|
|
113
113
|
end
|
114
114
|
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
end
|
118
118
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
<div class="row header">
|
2
|
+
<div class="col-sm-7">
|
3
|
+
<h3>Dynamic Queues</h3>
|
4
|
+
</div>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<p>
|
8
|
+
The list below shows the dynamic queues currently defined. When you start
|
9
|
+
a worker with a dynamic queue key (@key_name), that key is looked up from
|
10
|
+
the list below to determine the actual queues the worker should pull from.
|
11
|
+
Wildcards (*) and negation (leading !) can be used to select the queues the
|
12
|
+
worker should process. There is always a fallback key - @default, which
|
13
|
+
workers will use if the key for that worker is empty. If both the key and
|
14
|
+
the fallback are empty, the worker defaults to processing '*'
|
15
|
+
</p>
|
16
|
+
|
17
|
+
<form action="<%= root_path %>dynamicqueue" method="POST">
|
18
|
+
|
19
|
+
<table class="queues table table-hover table-bordered table-striped table-white">
|
20
|
+
<thead>
|
21
|
+
<th>Name</th>
|
22
|
+
<th>Value</th>
|
23
|
+
<th>Expanded</th>
|
24
|
+
<th></th>
|
25
|
+
</thead>
|
26
|
+
<% @queues.each_with_index do |data, i| %>
|
27
|
+
<tr class="line">
|
28
|
+
<td>
|
29
|
+
<input type="text" id="input-<%= i %>-name" name="queues[][name]" value="<%= data['name'] %>" />
|
30
|
+
</td>
|
31
|
+
<td>
|
32
|
+
<input type="text" id="input-<%= i %>-value" name="queues[][value]" value="<%= data['value'] %>" />
|
33
|
+
</td>
|
34
|
+
<td class="expanded">
|
35
|
+
<%= data['expanded'] %>
|
36
|
+
</td>
|
37
|
+
<td>
|
38
|
+
<a href="#remove" class="remove">Remove</a>
|
39
|
+
</td>
|
40
|
+
</tr>
|
41
|
+
<% end %>
|
42
|
+
</table>
|
43
|
+
<a href="#add" class="add">Add</a>
|
44
|
+
|
45
|
+
<input type="submit" value="Save" />
|
46
|
+
</form>
|
47
|
+
|
48
|
+
<script type="text/javascript">
|
49
|
+
function markDirty()
|
50
|
+
{
|
51
|
+
$("input[type=submit]").css({border:"3px orange solid"});
|
52
|
+
}
|
53
|
+
|
54
|
+
jQuery(function($) {
|
55
|
+
|
56
|
+
$("input").live("keypress", markDirty);
|
57
|
+
|
58
|
+
$("a.add").live("click", function(e) {
|
59
|
+
e.preventDefault();
|
60
|
+
var $table = $("table.queues");
|
61
|
+
var $newRow = $table.find("tr.line:first").clone();
|
62
|
+
$newRow.find("input[type=text]").attr("value", "");
|
63
|
+
$newRow.find("td.expanded").html("")
|
64
|
+
$newRow.appendTo($table);
|
65
|
+
markDirty();
|
66
|
+
});
|
67
|
+
|
68
|
+
$("a.remove").live("click", function(e) {
|
69
|
+
e.preventDefault();
|
70
|
+
var $link = $(this);
|
71
|
+
$link.parents("tr").remove();
|
72
|
+
markDirty();
|
73
|
+
});
|
74
|
+
|
75
|
+
|
76
|
+
});
|
77
|
+
</script>
|
data/spec/queues_spec.rb
CHANGED
@@ -242,7 +242,7 @@ describe "Dynamic Queues" do
|
|
242
242
|
|
243
243
|
it "finds work on dynamic queue that doesn't exist till after sidekiq is waiting for jobs" do
|
244
244
|
watch_queues(*%w[default])
|
245
|
-
|
245
|
+
launcher = run_queues("*", :async => true)
|
246
246
|
# give run_queues a chance to block on only the default queue given above
|
247
247
|
sleep 0.1
|
248
248
|
|
@@ -252,8 +252,7 @@ describe "Dynamic Queues" do
|
|
252
252
|
# that for it to re-evaluate the dynamic queues
|
253
253
|
sleep 2
|
254
254
|
timeout(5) do
|
255
|
-
|
256
|
-
manager.wait(:shutdown)
|
255
|
+
launcher.stop
|
257
256
|
end
|
258
257
|
SomeJob.result.should eq [1]
|
259
258
|
end
|
data/spec/server_spec.rb
CHANGED
@@ -94,10 +94,10 @@ describe "Dynamic Queues pages" do
|
|
94
94
|
set_dynamic_queue("key_two", ["bar", "baz"])
|
95
95
|
get "/dynamicqueue"
|
96
96
|
|
97
|
-
last_response.body.should
|
98
|
-
last_response.body.should
|
99
|
-
last_response.body.should
|
100
|
-
last_response.body.should
|
97
|
+
last_response.body.should include '<input type="text" id="input-0-name" name="queues[][name]" value="key_one" />'
|
98
|
+
last_response.body.should include '<input type="text" id="input-0-value" name="queues[][value]" value="foo" />'
|
99
|
+
last_response.body.should include '<input type="text" id="input-1-name" name="queues[][name]" value="key_two" />'
|
100
|
+
last_response.body.should include '<input type="text" id="input-1-value" name="queues[][value]" value="bar, baz" />'
|
101
101
|
end
|
102
102
|
|
103
103
|
it "should delete queues on empty queue submit" do
|
data/spec/spec_helper.rb
CHANGED
@@ -2,9 +2,7 @@ require 'rspec'
|
|
2
2
|
require 'sidekiq-dynamic-queues'
|
3
3
|
require 'celluloid'
|
4
4
|
require 'sidekiq'
|
5
|
-
require 'sidekiq/
|
6
|
-
require 'sidekiq/cli'
|
7
|
-
require 'sidekiq/manager'
|
5
|
+
require 'sidekiq/launcher'
|
8
6
|
|
9
7
|
Sidekiq.logger.level = Logger::DEBUG
|
10
8
|
Celluloid.logger = Sidekiq.logger = nil
|
@@ -73,23 +71,20 @@ end
|
|
73
71
|
def run_queues(*queues)
|
74
72
|
options = queues.last.is_a?(Hash) ? queues.pop : {}
|
75
73
|
options = {:async => false, :timeout => 5}.merge(options)
|
76
|
-
Sidekiq::Fetcher.instance_eval { @done = false }
|
77
|
-
manager = Sidekiq::Manager.new({:queues=>queues, :concurrency=>1, :timeout=>1})
|
78
74
|
|
79
|
-
|
80
|
-
|
75
|
+
sidekiq_opts = {:queues=>queues, :concurrency=>1, :timeout=>1}
|
76
|
+
Sidekiq::Fetcher.reset
|
77
|
+
launcher = Sidekiq::Launcher.new(sidekiq_opts)
|
78
|
+
launcher.run
|
79
|
+
|
81
80
|
unless options[:async]
|
82
81
|
# give up control so jobs can start running before we call stop
|
83
82
|
# Manager.when_done only gets called for jobs that succeed, not jobs that raise
|
84
83
|
sleep 0.1
|
85
|
-
|
86
|
-
|
87
|
-
timeout(options[:timeout]) do
|
88
|
-
manager.wait(:shutdown)
|
89
|
-
end
|
84
|
+
launcher.stop
|
90
85
|
end
|
91
86
|
|
92
|
-
|
87
|
+
launcher
|
93
88
|
end
|
94
89
|
|
95
90
|
class SomeJob
|
metadata
CHANGED
@@ -1,119 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-dynamic-queues
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.5.6
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Conway
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-04 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: sidekiq
|
16
|
-
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '2.9'
|
21
|
-
|
22
|
-
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.9'
|
27
|
-
none: false
|
28
|
-
prerelease: false
|
29
|
-
type: :runtime
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
|
-
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
33
30
|
requirements:
|
34
31
|
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
38
|
- - ">="
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
44
|
-
MA==
|
45
|
-
none: false
|
46
|
-
prerelease: false
|
47
|
-
type: :development
|
40
|
+
version: '0'
|
48
41
|
- !ruby/object:Gem::Dependency
|
49
42
|
name: rspec
|
50
|
-
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
51
44
|
requirements:
|
52
45
|
- - "~>"
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '2.5'
|
55
|
-
|
56
|
-
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
54
|
version: '2.5'
|
61
|
-
none: false
|
62
|
-
prerelease: false
|
63
|
-
type: :development
|
64
55
|
- !ruby/object:Gem::Dependency
|
65
56
|
name: sinatra
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
66
64
|
version_requirements: !ruby/object:Gem::Requirement
|
67
65
|
requirements:
|
68
66
|
- - ">="
|
69
67
|
- !ruby/object:Gem::Version
|
70
|
-
version:
|
71
|
-
|
72
|
-
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: slim
|
73
71
|
requirement: !ruby/object:Gem::Requirement
|
74
72
|
requirements:
|
75
73
|
- - ">="
|
76
74
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
MA==
|
79
|
-
none: false
|
80
|
-
prerelease: false
|
75
|
+
version: '0'
|
81
76
|
type: :development
|
82
|
-
|
83
|
-
name: slim
|
77
|
+
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
80
|
- - ">="
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
|
90
|
-
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack-test
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
92
86
|
requirements:
|
93
|
-
- - "
|
87
|
+
- - "~>"
|
94
88
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
96
|
-
MA==
|
97
|
-
none: false
|
98
|
-
prerelease: false
|
89
|
+
version: 0.5.4
|
99
90
|
type: :development
|
100
|
-
|
101
|
-
name: rack-test
|
91
|
+
prerelease: false
|
102
92
|
version_requirements: !ruby/object:Gem::Requirement
|
103
93
|
requirements:
|
104
94
|
- - "~>"
|
105
95
|
- !ruby/object:Gem::Version
|
106
96
|
version: 0.5.4
|
107
|
-
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: tilt
|
108
99
|
requirement: !ruby/object:Gem::Requirement
|
109
100
|
requirements:
|
110
101
|
- - "~>"
|
111
102
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
113
|
-
none: false
|
114
|
-
prerelease: false
|
103
|
+
version: '1.4'
|
115
104
|
type: :development
|
116
|
-
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.4'
|
111
|
+
description: A sidekiq plugin for specifying the queues a worker pulls from with wildcards,
|
112
|
+
negations, or dynamic look up from redis
|
117
113
|
email:
|
118
114
|
- matt@conwaysplace.com
|
119
115
|
executables: []
|
@@ -135,7 +131,7 @@ files:
|
|
135
131
|
- lib/sidekiq/dynamic_queues/attributes.rb
|
136
132
|
- lib/sidekiq/dynamic_queues/fetch.rb
|
137
133
|
- lib/sidekiq/dynamic_queues/server.rb
|
138
|
-
- lib/sidekiq/dynamic_queues/server/views/dynamicqueue.
|
134
|
+
- lib/sidekiq/dynamic_queues/server/views/dynamicqueue.erb
|
139
135
|
- lib/sidekiq/dynamic_queues/version.rb
|
140
136
|
- sidekiq-dynamic-queues.gemspec
|
141
137
|
- spec/queues_spec.rb
|
@@ -144,7 +140,8 @@ files:
|
|
144
140
|
- spec/spec_helper.rb
|
145
141
|
homepage: ''
|
146
142
|
licenses: []
|
147
|
-
|
143
|
+
metadata: {}
|
144
|
+
post_install_message:
|
148
145
|
rdoc_options: []
|
149
146
|
require_paths:
|
150
147
|
- lib
|
@@ -152,25 +149,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
149
|
requirements:
|
153
150
|
- - ">="
|
154
151
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
156
|
-
MA==
|
157
|
-
none: false
|
152
|
+
version: '0'
|
158
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
154
|
requirements:
|
160
155
|
- - ">="
|
161
156
|
- !ruby/object:Gem::Version
|
162
|
-
version:
|
163
|
-
MA==
|
164
|
-
none: false
|
157
|
+
version: '0'
|
165
158
|
requirements: []
|
166
159
|
rubyforge_project: sidekiq-dynamic-queues
|
167
|
-
rubygems_version:
|
168
|
-
signing_key:
|
169
|
-
specification_version:
|
170
|
-
summary: A sidekiq plugin for specifying the queues a worker pulls from with wildcards,
|
160
|
+
rubygems_version: 2.2.2
|
161
|
+
signing_key:
|
162
|
+
specification_version: 4
|
163
|
+
summary: A sidekiq plugin for specifying the queues a worker pulls from with wildcards,
|
164
|
+
negations, or dynamic look up from redis
|
171
165
|
test_files:
|
172
166
|
- spec/queues_spec.rb
|
173
167
|
- spec/redis-test.conf
|
174
168
|
- spec/server_spec.rb
|
175
169
|
- spec/spec_helper.rb
|
176
|
-
has_rdoc:
|
@@ -1,63 +0,0 @@
|
|
1
|
-
h3 Dynamic Queues
|
2
|
-
|
3
|
-
p class="intro"
|
4
|
-
| The list below shows the dynamic queues currently defined. When you start
|
5
|
-
a worker with a dynamic queue key (@key_name), that key is looked up from
|
6
|
-
the list below to determine the actual queues the worker should pull from.
|
7
|
-
Wildcards (*) and negation (leading !) can be used to select the queues the
|
8
|
-
worker should process. There is always a fallback key - @default, which
|
9
|
-
workers will use if the key for that worker is empty. If both the key and
|
10
|
-
the fallback are empty, the worker defaults to processing '*'
|
11
|
-
|
12
|
-
form action="#{root_path}dynamicqueue" method="POST"
|
13
|
-
|
14
|
-
table class="queues table table-hover table-bordered table-striped table-white"
|
15
|
-
thead
|
16
|
-
th Name
|
17
|
-
th Value
|
18
|
-
th Expanded
|
19
|
-
th
|
20
|
-
- @queues.each_with_index do |data, i|
|
21
|
-
tr class="line"
|
22
|
-
td
|
23
|
-
input type="text" id="input-#{{i}}-name" name="queues[][name]" value="#{{data['name']}}"
|
24
|
-
td
|
25
|
-
input type="text" id="input-#{{i}}-value" name="queues[][value]" value="#{{data['value']}}"
|
26
|
-
td class="expanded"
|
27
|
-
= data['expanded']
|
28
|
-
td
|
29
|
-
a href="#remove" class="remove" Remove
|
30
|
-
|
31
|
-
a href="#add" class="add" Add
|
32
|
-
|
33
|
-
input type="submit" value="Save"
|
34
|
-
|
35
|
-
javascript:
|
36
|
-
function markDirty()
|
37
|
-
{
|
38
|
-
$("input[type=submit]").css({border:"3px orange solid"});
|
39
|
-
}
|
40
|
-
|
41
|
-
jQuery(function($) {
|
42
|
-
|
43
|
-
$("input").live("keypress", markDirty);
|
44
|
-
|
45
|
-
$("a.add").live("click", function(e) {
|
46
|
-
e.preventDefault();
|
47
|
-
var $table = $("table.queues");
|
48
|
-
var $newRow = $table.find("tr.line:first").clone();
|
49
|
-
$newRow.find("input[type=text]").attr("value", "");
|
50
|
-
$newRow.find("td.expanded").html("")
|
51
|
-
$newRow.appendTo($table);
|
52
|
-
markDirty();
|
53
|
-
});
|
54
|
-
|
55
|
-
$("a.remove").live("click", function(e) {
|
56
|
-
e.preventDefault();
|
57
|
-
var $link = $(this);
|
58
|
-
$link.parents("tr").remove();
|
59
|
-
markDirty();
|
60
|
-
});
|
61
|
-
|
62
|
-
|
63
|
-
});
|