shoryuken 2.0.1 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -1
- data/lib/shoryuken.rb +20 -1
- data/lib/shoryuken/cli.rb +3 -1
- data/lib/shoryuken/environment_loader.rb +1 -1
- data/lib/shoryuken/manager.rb +2 -0
- data/lib/shoryuken/queue.rb +3 -1
- data/lib/shoryuken/util.rb +14 -0
- data/lib/shoryuken/version.rb +1 -1
- data/lib/shoryuken/worker.rb +3 -2
- data/spec/shoryuken/middleware/server/auto_delete_spec.rb +2 -2
- data/spec/shoryuken/middleware/server/exponential_backoff_retry_spec.rb +6 -2
- data/spec/shoryuken/middleware/server/timing_spec.rb +2 -2
- data/spec/shoryuken/processor_spec.rb +1 -1
- data/spec/shoryuken/queue_spec.rb +16 -0
- data/spec/shoryuken/worker_spec.rb +17 -0
- 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: f62098d7fa2041d2ae1cfd8a4cfedd0e09766bbb
|
4
|
+
data.tar.gz: 38445deab5aeb3a08310d105264338d64e5d835d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ac1f46247119f055a0ed55494d7e39f687520197790458effdb8b23323cf9cb8d54ba64ce5107e8e53285522c7083dc90298afc2b202589945b80c51d5c1835
|
7
|
+
data.tar.gz: 6c2997f79ad3822134fa0a2f5be6563e3b382ac17134a7afcdaf812c78719f56f657c430ee7b3b4880f0ca9022f3e17514f9e7e1a835a71283e65fa169e6d36d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## [v2.0.2] - 2015-10-22
|
2
|
+
|
3
|
+
- Fix warnings that are triggered in some cases with the raise_error matcher
|
4
|
+
- [#144](https://github.com/phstc/shoryuken/pull/144)
|
5
|
+
|
6
|
+
- Add lifecycle event registration support
|
7
|
+
- [#141](https://github.com/phstc/shoryuken/pull/141)
|
8
|
+
|
9
|
+
- Allow passing array of messages to send_messages
|
10
|
+
- [#140](https://github.com/phstc/shoryuken/pull/140)
|
11
|
+
|
12
|
+
- Fix Active Job queue prefixing in Rails apps
|
13
|
+
- [#139](https://github.com/phstc/shoryuken/pull/139)
|
14
|
+
|
15
|
+
- Enable override the default queue with a :queue option
|
16
|
+
- [#147](https://github.com/phstc/shoryuken/pull/147)
|
17
|
+
|
1
18
|
## [v2.0.1] - 2015-10-09
|
2
19
|
|
3
20
|
- Bump aws-sdk to ~> 2
|
@@ -13,4 +30,4 @@
|
|
13
30
|
|
14
31
|
- README updates
|
15
32
|
- [#122](https://github.com/phstc/shoryuken/pull/122)
|
16
|
-
- [#120](https://github.com/phstc/shoryuken/pull/120)
|
33
|
+
- [#120](https://github.com/phstc/shoryuken/pull/120)
|
data/lib/shoryuken.rb
CHANGED
@@ -26,7 +26,12 @@ module Shoryuken
|
|
26
26
|
queues: [],
|
27
27
|
aws: {},
|
28
28
|
delay: 0,
|
29
|
-
timeout: 8
|
29
|
+
timeout: 8,
|
30
|
+
lifecycle_events: {
|
31
|
+
startup: [],
|
32
|
+
quiet: [],
|
33
|
+
shutdown: [],
|
34
|
+
}
|
30
35
|
}
|
31
36
|
|
32
37
|
@@queues = []
|
@@ -112,6 +117,20 @@ module Shoryuken
|
|
112
117
|
@stop_callback = block
|
113
118
|
end
|
114
119
|
|
120
|
+
# Register a block to run at a point in the Shoryuken lifecycle.
|
121
|
+
# :startup, :quiet or :shutdown are valid events.
|
122
|
+
#
|
123
|
+
# Shoryuken.configure_server do |config|
|
124
|
+
# config.on(:shutdown) do
|
125
|
+
# puts "Goodbye cruel world!"
|
126
|
+
# end
|
127
|
+
# end
|
128
|
+
def on(event, &block)
|
129
|
+
raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
|
130
|
+
raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
|
131
|
+
options[:lifecycle_events][event] << block
|
132
|
+
end
|
133
|
+
|
115
134
|
attr_reader :aws_initialization_callback,
|
116
135
|
:start_callback,
|
117
136
|
:stop_callback
|
data/lib/shoryuken/cli.rb
CHANGED
@@ -45,6 +45,8 @@ module Shoryuken
|
|
45
45
|
callback.call
|
46
46
|
end
|
47
47
|
|
48
|
+
fire_event(:startup)
|
49
|
+
|
48
50
|
begin
|
49
51
|
launcher.run
|
50
52
|
|
@@ -173,7 +175,7 @@ module Shoryuken
|
|
173
175
|
logger.info { 'Received USR1, will soft shutdown down' }
|
174
176
|
|
175
177
|
launcher.stop
|
176
|
-
|
178
|
+
fire_event(:quiet, true)
|
177
179
|
exit 0
|
178
180
|
when 'TTIN'
|
179
181
|
Thread.list.each do |thread|
|
@@ -113,7 +113,7 @@ module Shoryuken
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def prefix_active_job_queue_names
|
116
|
-
return unless
|
116
|
+
return unless defined? ::ActiveJob
|
117
117
|
return unless Shoryuken.active_job_queue_name_prefixing
|
118
118
|
|
119
119
|
queue_name_prefix = ::ActiveJob::Base.queue_name_prefix
|
data/lib/shoryuken/manager.rb
CHANGED
data/lib/shoryuken/queue.rb
CHANGED
@@ -42,7 +42,9 @@ module Shoryuken
|
|
42
42
|
def sanitize_messages!(options)
|
43
43
|
options = case
|
44
44
|
when options.is_a?(Array)
|
45
|
-
{ entries: options.map.with_index
|
45
|
+
{ entries: options.map.with_index do |m, index|
|
46
|
+
{ id: index.to_s }.merge(m.is_a?(Hash) ? m : { message_body: m })
|
47
|
+
end }
|
46
48
|
when options.is_a?(Hash)
|
47
49
|
options
|
48
50
|
end
|
data/lib/shoryuken/util.rb
CHANGED
@@ -12,6 +12,20 @@ module Shoryuken
|
|
12
12
|
Shoryuken.logger
|
13
13
|
end
|
14
14
|
|
15
|
+
def fire_event(event, reverse = false)
|
16
|
+
logger.debug { "Firing '#{event}' lifecycle event" }
|
17
|
+
arr = Shoryuken.options[:lifecycle_events][event]
|
18
|
+
arr.reverse! if reverse
|
19
|
+
arr.each do |block|
|
20
|
+
begin
|
21
|
+
block.call
|
22
|
+
rescue => ex
|
23
|
+
logger.warn(event: event)
|
24
|
+
logger.warn "#{ex.class.name}: #{ex.message}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
def elapsed(started_at)
|
16
30
|
# elapsed in ms
|
17
31
|
(Time.now - started_at) * 1000
|
data/lib/shoryuken/version.rb
CHANGED
data/lib/shoryuken/worker.rb
CHANGED
@@ -6,7 +6,6 @@ module Shoryuken
|
|
6
6
|
|
7
7
|
module ClassMethods
|
8
8
|
def perform_async(body, options = {})
|
9
|
-
options ||= {}
|
10
9
|
options[:message_attributes] ||= {}
|
11
10
|
options[:message_attributes]['shoryuken_class'] = {
|
12
11
|
string_value: self.to_s,
|
@@ -15,7 +14,9 @@ module Shoryuken
|
|
15
14
|
|
16
15
|
options[:message_body] = body
|
17
16
|
|
18
|
-
|
17
|
+
queue = options.delete(:queue) || get_shoryuken_options['queue']
|
18
|
+
|
19
|
+
Shoryuken::Client.queues(queue).send_message(options)
|
19
20
|
end
|
20
21
|
|
21
22
|
def perform_in(interval, body, options = {})
|
@@ -55,8 +55,8 @@ describe Shoryuken::Middleware::Server::AutoDelete do
|
|
55
55
|
expect(sqs_queue).to_not receive(:delete_messages)
|
56
56
|
|
57
57
|
expect {
|
58
|
-
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise }
|
59
|
-
}.to raise_error
|
58
|
+
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise 'Error' }
|
59
|
+
}.to raise_error(RuntimeError, 'Error')
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -25,7 +25,9 @@ describe Shoryuken::Middleware::Server::ExponentialBackoffRetry do
|
|
25
25
|
it 'does not retry the job by default' do
|
26
26
|
expect(sqs_msg).not_to receive(:change_visibility)
|
27
27
|
|
28
|
-
expect {
|
28
|
+
expect {
|
29
|
+
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise 'Error' }
|
30
|
+
}.to raise_error(RuntimeError, 'Error')
|
29
31
|
end
|
30
32
|
|
31
33
|
it 'does not retry the job if :retry_intervals is empty' do
|
@@ -33,7 +35,9 @@ describe Shoryuken::Middleware::Server::ExponentialBackoffRetry do
|
|
33
35
|
|
34
36
|
expect(sqs_msg).not_to receive(:change_visibility)
|
35
37
|
|
36
|
-
expect {
|
38
|
+
expect {
|
39
|
+
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise 'Error' }
|
40
|
+
}.to raise_error(RuntimeError, 'Error')
|
37
41
|
end
|
38
42
|
|
39
43
|
it 'retries the job if :retry_intervals is non-empty' do
|
@@ -54,8 +54,8 @@ describe Shoryuken::Middleware::Server::Timing do
|
|
54
54
|
end
|
55
55
|
|
56
56
|
expect {
|
57
|
-
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise }
|
58
|
-
}.to raise_error
|
57
|
+
subject.call(TestWorker.new, queue, sqs_msg, sqs_msg.body) { raise 'Error' }
|
58
|
+
}.to raise_error(RuntimeError, 'Error')
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -299,7 +299,7 @@ describe Shoryuken::Processor do
|
|
299
299
|
it 'does not extend the message invisibility' do
|
300
300
|
expect(sqs_msg).to receive(:visibility_timeout=).never
|
301
301
|
expect_any_instance_of(TestWorker).to receive(:perform).and_raise 'worker failed'
|
302
|
-
expect { subject.process(queue, sqs_msg) }.to raise_error
|
302
|
+
expect { subject.process(queue, sqs_msg) }.to raise_error(RuntimeError, 'worker failed')
|
303
303
|
end
|
304
304
|
end
|
305
305
|
end
|
@@ -77,6 +77,22 @@ describe Shoryuken::Queue do
|
|
77
77
|
subject.send_messages(entries: [{ id: '0', message_body: 'msg1'}, { id: '1', message_body: 'msg2' }])
|
78
78
|
end
|
79
79
|
|
80
|
+
it 'accepts an array of messages' do
|
81
|
+
expect(sqs).to receive(:send_message_batch).with(hash_including(entries: [{ id: '0', message_body: 'msg1', delay_seconds: 1, message_attributes: { attr: 'attr1' } }, { id: '1', message_body: 'msg2', delay_seconds: 1, message_attributes: { attr: 'attr2' } }]))
|
82
|
+
|
83
|
+
subject.send_messages([
|
84
|
+
{
|
85
|
+
message_body: 'msg1',
|
86
|
+
delay_seconds: 1,
|
87
|
+
message_attributes: { attr: 'attr1' }
|
88
|
+
}, {
|
89
|
+
message_body: 'msg2',
|
90
|
+
delay_seconds: 1,
|
91
|
+
message_attributes: { attr: 'attr2' }
|
92
|
+
}
|
93
|
+
])
|
94
|
+
end
|
95
|
+
|
80
96
|
it 'accepts an array of string' do
|
81
97
|
expect(sqs).to receive(:send_message_batch).with(hash_including(entries: [{ id: '0', message_body: 'msg1'}, { id: '1', message_body: 'msg2' }]))
|
82
98
|
|
@@ -79,6 +79,23 @@ describe 'Shoryuken::Worker' do
|
|
79
79
|
|
80
80
|
TestWorker.perform_async('delayed message', delay_seconds: 60)
|
81
81
|
end
|
82
|
+
|
83
|
+
it 'accepts an `queue` option' do
|
84
|
+
new_queue = 'some_different_queue'
|
85
|
+
|
86
|
+
expect(Shoryuken::Client).to receive(:queues).with(new_queue).and_return(sqs_queue)
|
87
|
+
|
88
|
+
expect(sqs_queue).to receive(:send_message).with(
|
89
|
+
message_attributes: {
|
90
|
+
'shoryuken_class' => {
|
91
|
+
string_value: TestWorker.to_s,
|
92
|
+
data_type: 'String'
|
93
|
+
}
|
94
|
+
},
|
95
|
+
message_body: 'delayed message')
|
96
|
+
|
97
|
+
TestWorker.perform_async('delayed message', queue: new_queue)
|
98
|
+
end
|
82
99
|
end
|
83
100
|
|
84
101
|
describe '.shoryuken_options' 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: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pablo Cantero
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|