shoryuken 3.1.4 → 3.1.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/shoryuken/launcher.rb +2 -17
- data/lib/shoryuken/manager.rb +12 -3
- data/lib/shoryuken/queue.rb +12 -5
- data/lib/shoryuken/version.rb +1 -1
- data/spec/shoryuken/queue_spec.rb +43 -32
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed935b3a706f2e96acd020a62bee5141910bf63f
|
4
|
+
data.tar.gz: 502827e59b4c18b605eccbd7c9b31829afaef23e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz: '
|
6
|
+
metadata.gz: 802af1fc13ac74c36745582d3b796def81bfdd53d8340a44ea212813a8cb3598d40969821c8172eeba6dca2a10a8be8affce9d7390dee028660a46f909533601
|
7
|
+
data.tar.gz: '075822afd74835bbe91e49efa991dc24957405ce830005f2f4c59d0add5e5db39633680a5bda5647af7ec7e74815ca0050ea6a316bf5e5bed870d7e048224db1'
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [v3.1.5] - 2017-07-23
|
2
|
+
|
3
|
+
- Fix memory leak
|
4
|
+
- [#414](https://github.com/phstc/shoryuken/pull/414)
|
5
|
+
|
6
|
+
- Fail fast on bad queue URLs
|
7
|
+
- [#413](https://github.com/phstc/shoryuken/pull/413)
|
8
|
+
|
1
9
|
## [v3.1.4] - 2017-07-14
|
2
10
|
|
3
11
|
- Require forwardable allowding to call `shoryuken` without `bundle exec`
|
data/lib/shoryuken/launcher.rb
CHANGED
@@ -3,8 +3,7 @@ module Shoryuken
|
|
3
3
|
include Util
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@managers
|
7
|
-
@shutdowning = Concurrent::AtomicBoolean.new(false)
|
6
|
+
@managers = create_managers
|
8
7
|
end
|
9
8
|
|
10
9
|
def start
|
@@ -41,24 +40,10 @@ module Shoryuken
|
|
41
40
|
|
42
41
|
def start_managers
|
43
42
|
@managers.each do |manager|
|
44
|
-
Concurrent::
|
45
|
-
log_manager_failure(ex)
|
46
|
-
start_soft_shutdown
|
47
|
-
end
|
43
|
+
Concurrent::Future.execute { manager.start }
|
48
44
|
end
|
49
45
|
end
|
50
46
|
|
51
|
-
def start_soft_shutdown
|
52
|
-
Process.kill('USR1', Process.pid) if @shutdowning.make_true
|
53
|
-
end
|
54
|
-
|
55
|
-
def log_manager_failure(ex)
|
56
|
-
return unless ex
|
57
|
-
|
58
|
-
logger.error { "Manager failed: #{ex.message}" }
|
59
|
-
logger.error { ex.backtrace.join("\n") } unless ex.backtrace.nil?
|
60
|
-
end
|
61
|
-
|
62
47
|
def initiate_stop
|
63
48
|
logger.info { 'Shutting down' }
|
64
49
|
|
data/lib/shoryuken/manager.rb
CHANGED
@@ -27,9 +27,7 @@ module Shoryuken
|
|
27
27
|
def dispatch_loop
|
28
28
|
return unless running?
|
29
29
|
|
30
|
-
|
31
|
-
executor: @executor
|
32
|
-
) { dispatch }.then { dispatch_loop }.rescue { |ex| raise ex }
|
30
|
+
@executor.post { dispatch }
|
33
31
|
end
|
34
32
|
|
35
33
|
def dispatch
|
@@ -44,6 +42,10 @@ module Shoryuken
|
|
44
42
|
logger.debug { "Ready: #{ready}, Busy: #{busy}, Active Queues: #{@polling_strategy.active_queues}" }
|
45
43
|
|
46
44
|
batched_queue?(queue) ? dispatch_batch(queue) : dispatch_single_messages(queue)
|
45
|
+
|
46
|
+
dispatch_loop
|
47
|
+
rescue => ex
|
48
|
+
handle_dispatch_error(ex)
|
47
49
|
end
|
48
50
|
|
49
51
|
def busy
|
@@ -96,5 +98,12 @@ module Shoryuken
|
|
96
98
|
|
97
99
|
sqs_msgs
|
98
100
|
end
|
101
|
+
|
102
|
+
def handle_dispatch_error(ex)
|
103
|
+
logger.error { "Manager failed: #{ex.message}" }
|
104
|
+
logger.error { ex.backtrace.join("\n") } unless ex.backtrace.nil?
|
105
|
+
|
106
|
+
Process.kill('USR1', Process.pid)
|
107
|
+
end
|
99
108
|
end
|
100
109
|
end
|
data/lib/shoryuken/queue.rb
CHANGED
@@ -49,20 +49,27 @@ module Shoryuken
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
def
|
52
|
+
def set_by_name(name)
|
53
53
|
self.name = name
|
54
54
|
self.url = client.get_queue_url(queue_name: name).queue_url
|
55
|
-
rescue Aws::Errors::NoSuchEndpointError, Aws::SQS::Errors::NonExistentQueue => ex
|
56
|
-
raise ex, "The specified queue #{name} does not exist."
|
57
55
|
end
|
58
56
|
|
59
|
-
def
|
57
|
+
def set_by_url(url)
|
60
58
|
self.name = url.split('/').last
|
61
59
|
self.url = url
|
62
60
|
end
|
63
61
|
|
64
62
|
def set_name_and_url(name_or_url)
|
65
|
-
name_or_url.start_with?('https://sqs.')
|
63
|
+
if name_or_url.start_with?('https://sqs.')
|
64
|
+
set_by_url(name_or_url)
|
65
|
+
|
66
|
+
# anticipate the fifo? checker for validating the queue URL
|
67
|
+
return fifo?
|
68
|
+
end
|
69
|
+
|
70
|
+
set_by_name(name_or_url)
|
71
|
+
rescue Aws::Errors::NoSuchEndpointError, Aws::SQS::Errors::NonExistentQueue => ex
|
72
|
+
raise ex, "The specified queue #{name_or_url} does not exist."
|
66
73
|
end
|
67
74
|
|
68
75
|
def queue_attributes
|
data/lib/shoryuken/version.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/BlockLength
|
3
4
|
RSpec.describe Shoryuken::Queue do
|
4
5
|
let(:credentials) { Aws::Credentials.new('access_key_id', 'secret_access_key') }
|
5
6
|
let(:sqs) { Aws::SQS::Client.new(stub_responses: true, credentials: credentials) }
|
@@ -15,10 +16,12 @@ RSpec.describe Shoryuken::Queue do
|
|
15
16
|
end
|
16
17
|
|
17
18
|
describe '#new' do
|
18
|
-
context 'when queue
|
19
|
-
|
19
|
+
context 'when queue URL supplied' do
|
20
|
+
it 'instantiates by URL and validate the URL' do
|
21
|
+
expect_any_instance_of(described_class).to receive(:fifo?).and_return(false)
|
22
|
+
|
23
|
+
subject = described_class.new(sqs, queue_url)
|
20
24
|
|
21
|
-
specify do
|
22
25
|
expect(subject.name).to eq(queue_name)
|
23
26
|
end
|
24
27
|
end
|
@@ -51,7 +54,9 @@ RSpec.describe Shoryuken::Queue do
|
|
51
54
|
failure = double(id: 'id', code: 'code', message: '...', sender_fault: false)
|
52
55
|
logger = double 'Logger'
|
53
56
|
|
54
|
-
expect(sqs).to
|
57
|
+
expect(sqs).to(
|
58
|
+
receive(:delete_message_batch).with(entries: entries, queue_url: queue_url).and_return(double(failed: [failure]))
|
59
|
+
)
|
55
60
|
expect(subject).to receive(:logger).and_return(logger)
|
56
61
|
expect(logger).to receive(:error)
|
57
62
|
|
@@ -111,36 +116,30 @@ RSpec.describe Shoryuken::Queue do
|
|
111
116
|
end
|
112
117
|
|
113
118
|
describe '#send_messages' do
|
114
|
-
before {
|
115
|
-
|
116
|
-
}
|
119
|
+
before { allow(subject).to receive(:fifo?).and_return(false) }
|
120
|
+
|
117
121
|
it 'accepts SQS request parameters' do
|
118
122
|
# https://docs.aws.amazon.com/sdkforruby/api/Aws/SQS/Client.html#send_message_batch-instance_method
|
119
|
-
expect(sqs).to
|
123
|
+
expect(sqs).to(
|
124
|
+
receive(:send_message_batch).with(hash_including(entries: [{id: '0', message_body: 'msg1'}, {id: '1', message_body: 'msg2'}]))
|
125
|
+
)
|
120
126
|
|
121
127
|
subject.send_messages(entries: [{id: '0', message_body: 'msg1'}, {id: '1', message_body: 'msg2'}])
|
122
128
|
end
|
123
129
|
|
124
130
|
it 'accepts an array of messages' do
|
125
|
-
options = { entries: [
|
126
|
-
message_body: 'msg1',
|
127
|
-
delay_seconds: 1,
|
128
|
-
|
129
|
-
{ id: '1',
|
130
|
-
message_body: 'msg2',
|
131
|
-
delay_seconds: 1,
|
132
|
-
message_attributes: { attr: 'attr2' } }] }
|
133
|
-
|
131
|
+
options = { entries: [
|
132
|
+
{ id: '0', message_body: 'msg1', delay_seconds: 1, message_attributes: { attr: 'attr1' } },
|
133
|
+
{ id: '1', message_body: 'msg2', delay_seconds: 1, message_attributes: { attr: 'attr2' } }
|
134
|
+
] }
|
134
135
|
expect(sqs).to receive(:send_message_batch).with(hash_including(options))
|
135
136
|
|
136
|
-
subject.send_messages(
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
message_attributes: { attr: 'attr2' }
|
143
|
-
}])
|
137
|
+
subject.send_messages(
|
138
|
+
[
|
139
|
+
{ message_body: 'msg1', delay_seconds: 1, message_attributes: { attr: 'attr1' } },
|
140
|
+
{ message_body: 'msg2', delay_seconds: 1, message_attributes: { attr: 'attr2' } }
|
141
|
+
]
|
142
|
+
)
|
144
143
|
end
|
145
144
|
|
146
145
|
context 'when FIFO' do
|
@@ -170,16 +169,24 @@ RSpec.describe Shoryuken::Queue do
|
|
170
169
|
expect(first_entry[:message_deduplication_id]).to eq 'my id'
|
171
170
|
end
|
172
171
|
|
173
|
-
subject.send_messages(
|
174
|
-
|
175
|
-
|
176
|
-
|
172
|
+
subject.send_messages(
|
173
|
+
[
|
174
|
+
{ message_body: 'msg1',
|
175
|
+
message_attributes: { attr: 'attr1' },
|
176
|
+
message_group_id: 'my group',
|
177
|
+
message_deduplication_id: 'my id' }
|
178
|
+
]
|
179
|
+
)
|
177
180
|
end
|
178
181
|
end
|
179
182
|
end
|
180
183
|
|
181
184
|
it 'accepts an array of string' do
|
182
|
-
expect(sqs).to
|
185
|
+
expect(sqs).to(
|
186
|
+
receive(:send_message_batch).with(
|
187
|
+
hash_including(entries: [{ id: '0', message_body: 'msg1' }, { id: '1', message_body: 'msg2' }])
|
188
|
+
)
|
189
|
+
)
|
183
190
|
|
184
191
|
subject.send_messages(%w(msg1 msg2))
|
185
192
|
end
|
@@ -189,9 +196,13 @@ RSpec.describe Shoryuken::Queue do
|
|
189
196
|
before do
|
190
197
|
attribute_response = double 'Aws::SQS::Types::GetQueueAttributesResponse'
|
191
198
|
|
192
|
-
allow(attribute_response).to
|
199
|
+
allow(attribute_response).to(
|
200
|
+
receive(:attributes).and_return('FifoQueue' => fifo.to_s, 'ContentBasedDeduplication' => 'true')
|
201
|
+
)
|
193
202
|
allow(subject).to receive(:url).and_return(queue_url)
|
194
|
-
allow(sqs).to
|
203
|
+
allow(sqs).to(
|
204
|
+
receive(:get_queue_attributes).with(queue_url: queue_url, attribute_names: ['All']).and_return(attribute_response)
|
205
|
+
)
|
195
206
|
end
|
196
207
|
|
197
208
|
context 'when queue is FIFO' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shoryuken
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pablo Cantero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|