shoryuken 3.1.6 → 3.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3418f84df488f7c36c21d87b9fda96cedac66407
4
- data.tar.gz: 0e1183b0fca34e62be3f9e965bbfcfc823111251
3
+ metadata.gz: 52a8705f1b474b12c77323776c903bd2e1ff6ba1
4
+ data.tar.gz: 25792ada1e4231fa80c7c461affa364bbe8f9afa
5
5
  SHA512:
6
- metadata.gz: 0a028333d4c876ee617270d744eeddf59ef5005ac5937151734912dffcbbbb59798a05b9be4ae94b97bc1d991c35b01785c8985a99df341132a55ae63926389f
7
- data.tar.gz: bfcdaf2ec179ddb46e21bffcea2413c7d196c0cacb8b81d7586e5f1645049eb5b1dc15aef86a520a04281118c65559d0849ecbf83b1780bb8a31d71c6f763027
6
+ metadata.gz: bcc31cc6ea76c07965f0ef5e4d13f29407fcf7423d8441df46867255cd5beaec0e694f9d5e45f6be181d1f1f926f51752f64d6027be8dfacfbd721052138de70
7
+ data.tar.gz: 4c7a4b04713c37edbf2e1e2965b3135a6d603ff686f42f74a45f6e5b1b9212f71db155703c92433785357281568ec705cd02e23413abcb46dc079b43df57bad7
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
- - 2.1.0
4
+ - 2.1.10
5
5
  - 2.2.0
6
6
  - 2.3.3
7
7
  - 2.4.1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [v3.1.7] - 2017-07-31
2
+
3
+ - Allow polling strategy per group
4
+ - [#417](https://github.com/phstc/shoryuken/pull/417)
5
+
6
+ - Add support for creating FIFO queues
7
+ - [#419](https://github.com/phstc/shoryuken/pull/419)
8
+
9
+ - Allow receive message options per queue
10
+ - [#420](https://github.com/phstc/shoryuken/pull/420)
11
+
1
12
  ## [v3.1.6] - 2017-07-24
2
13
 
3
14
  - Fix issue with dispatch_loop and delays
data/bin/cli/sqs.rb CHANGED
@@ -96,8 +96,8 @@ module Shoryuken
96
96
  end
97
97
 
98
98
  desc 'ls [QUEUE-NAME-PREFIX]', 'Lists queues'
99
- method_option :watch, aliases: '-w', type: :boolean, desc: 'watch queues'
100
- method_option :watch_interval, type: :numeric, default: 10, desc: 'watch interval'
99
+ method_option :watch, aliases: '-w', type: :boolean, desc: 'watch queues'
100
+ method_option :interval, aliases: '-n', type: :numeric, default: 2, desc: 'watch interval in seconds'
101
101
  def ls(queue_name_prefix = '')
102
102
  trap('SIGINT', 'EXIT') # expect ctrl-c from loop
103
103
 
@@ -108,7 +108,7 @@ module Shoryuken
108
108
 
109
109
  break unless options[:watch]
110
110
 
111
- sleep options[:watch_interval]
111
+ sleep options[:interval]
112
112
  puts
113
113
  end
114
114
  end
@@ -187,8 +187,12 @@ module Shoryuken
187
187
  end
188
188
 
189
189
  desc 'create QUEUE-NAME', 'Create a queue'
190
+ method_option :attributes, aliases: '-a', type: :hash, default: {}, desc: 'queue attributes'
190
191
  def create(queue_name)
191
- queue_url = sqs.create_queue(queue_name: queue_name).queue_url
192
+ attributes = options[:attributes]
193
+ attributes['FifoQueue'] ||= 'true' if queue_name.end_with?('.fifo')
194
+
195
+ queue_url = sqs.create_queue(queue_name: queue_name, attributes: attributes).queue_url
192
196
 
193
197
  say "Queue #{queue_name} was successfully created. Queue URL #{queue_url}", :green
194
198
  end
data/bin/shoryuken CHANGED
@@ -32,7 +32,7 @@ module Shoryuken
32
32
  opts = options.to_h.symbolize_keys
33
33
 
34
34
  if opts[:config_file]
35
- say "[DEPRECATED] Please use --config instead of --config-file", :yellow
35
+ say '[DEPRECATED] Please use --config instead of --config-file', :yellow
36
36
  end
37
37
 
38
38
  opts[:config_file] = opts.delete(:config) if opts[:config]
@@ -4,8 +4,6 @@ module Shoryuken
4
4
 
5
5
  FETCH_LIMIT = 10
6
6
 
7
- attr_reader :group
8
-
9
7
  def initialize(group)
10
8
  @group = group
11
9
  end
@@ -26,12 +24,9 @@ module Shoryuken
26
24
  private
27
25
 
28
26
  def receive_messages(queue, limit)
29
- # AWS limits the batch size by 10
30
- limit = limit > FETCH_LIMIT ? FETCH_LIMIT : limit
31
-
32
- options = Shoryuken.sqs_client_receive_message_opts[group].to_h.dup
27
+ options = receive_options(queue)
33
28
 
34
- options[:max_number_of_messages] = limit
29
+ options[:max_number_of_messages] = max_number_of_messages(limit, options)
35
30
  options[:message_attribute_names] = %w(All)
36
31
  options[:attribute_names] = %w(All)
37
32
 
@@ -39,5 +34,16 @@ module Shoryuken
39
34
 
40
35
  Shoryuken::Client.queues(queue.name).receive_messages(options)
41
36
  end
37
+
38
+ def max_number_of_messages(limit, options)
39
+ [limit, FETCH_LIMIT, options[:max_number_of_messages]].compact.min
40
+ end
41
+
42
+ def receive_options(queue)
43
+ options = Shoryuken.sqs_client_receive_message_opts[queue.name]
44
+ options ||= Shoryuken.sqs_client_receive_message_opts[@group]
45
+
46
+ options.to_h.dup
47
+ end
42
48
  end
43
49
  end
@@ -57,7 +57,18 @@ module Shoryuken
57
57
  end
58
58
 
59
59
  def polling_strategy(group)
60
- options[group].to_h.fetch(:polling_strategy, Polling::WeightedRoundRobin)
60
+ strategy = (group == 'default' ? options : options[:groups][group]).to_h[:polling_strategy]
61
+
62
+ case strategy
63
+ when 'WeightedRoundRobin', nil # Default case
64
+ Polling::WeightedRoundRobin
65
+ when 'StrictPriority'
66
+ Polling::StrictPriority
67
+ when Class
68
+ strategy
69
+ else
70
+ raise ArgumentError, "#{strategy} is not a valid polling_strategy"
71
+ end
61
72
  end
62
73
 
63
74
  def start_callback
@@ -118,10 +118,12 @@ module Shoryuken
118
118
  end
119
119
 
120
120
  def handle_signal(sig)
121
+ logger.debug "Got #{sig} signal"
122
+
121
123
  case sig
122
124
  when 'USR1' then execute_soft_shutdown
123
125
  when 'TTIN' then print_threads_backtrace
124
- else
126
+ when 'TERM', 'INT'
125
127
  logger.info { "Received #{sig}, will shutdown down" }
126
128
 
127
129
  raise Interrupt
@@ -1,3 +1,3 @@
1
1
  module Shoryuken
2
- VERSION = '3.1.6'.freeze
2
+ VERSION = '3.1.7'.freeze
3
3
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
  require 'shoryuken/manager'
3
3
  require 'shoryuken/fetcher'
4
4
 
5
+ # rubocop:disable Metrics/BlockLength
5
6
  RSpec.describe Shoryuken::Fetcher do
6
7
  let(:queue) { instance_double('Shoryuken::Queue') }
7
8
  let(:queue_name) { 'default' }
@@ -13,7 +14,7 @@ RSpec.describe Shoryuken::Fetcher do
13
14
  Shoryuken::Message,
14
15
  queue_url: queue_name,
15
16
  body: 'test',
16
- message_id: 'fc754df79cc24c4196ca5996a44b771e',
17
+ message_id: 'fc754df79cc24c4196ca5996a44b771e'
17
18
  )
18
19
  end
19
20
 
@@ -27,23 +28,58 @@ RSpec.describe Shoryuken::Fetcher do
27
28
 
28
29
  Shoryuken.sqs_client_receive_message_opts[group] = { wait_time_seconds: 10 }
29
30
 
30
- expect(queue).to receive(:receive_messages).
31
- with(wait_time_seconds: 10, max_number_of_messages: limit, message_attribute_names: ['All'], attribute_names: ['All']).
32
- and_return([])
31
+ expect(queue).to receive(:receive_messages).with(
32
+ wait_time_seconds: 10,
33
+ max_number_of_messages: limit,
34
+ message_attribute_names: ['All'],
35
+ attribute_names: ['All']
36
+ ).and_return([])
33
37
 
34
38
  subject.fetch(queue_config, limit)
35
39
  end
36
40
 
41
+ context 'when receive options per queue' do
42
+ let(:limit) { 5 }
43
+
44
+ specify do
45
+ expect(Shoryuken::Client).to receive(:queues).with(queue_name).and_return(queue)
46
+
47
+ Shoryuken.sqs_client_receive_message_opts[queue_name] = { max_number_of_messages: 1 }
48
+
49
+ expect(queue).to receive(:receive_messages).with(
50
+ max_number_of_messages: 1,
51
+ message_attribute_names: ['All'],
52
+ attribute_names: ['All']
53
+ ).and_return([])
54
+
55
+ subject.fetch(queue_config, limit)
56
+ end
57
+ end
58
+
59
+ context 'when max_number_of_messages opt is great than limit' do
60
+ it 'uses limit' do
61
+ expect(Shoryuken::Client).to receive(:queues).with(queue_name).and_return(queue)
62
+
63
+ Shoryuken.sqs_client_receive_message_opts[queue_name] = { max_number_of_messages: 20 }
64
+
65
+ expect(queue).to receive(:receive_messages).with(
66
+ max_number_of_messages: limit,
67
+ message_attribute_names: ['All'],
68
+ attribute_names: ['All']
69
+ ).and_return([])
70
+
71
+ subject.fetch(queue_config, limit)
72
+ end
73
+ end
74
+
37
75
  context 'when limit is greater than FETCH_LIMIT' do
38
76
  let(:limit) { 20 }
39
77
 
40
78
  specify do
41
- Shoryuken.sqs_client_receive_message_opts[group] = {}
42
-
43
79
  allow(Shoryuken::Client).to receive(:queues).with(queue_name).and_return(queue)
44
- expect(queue).to receive(:receive_messages).
45
- with(max_number_of_messages: described_class::FETCH_LIMIT, attribute_names: ['All'], message_attribute_names: ['All']).
46
- and_return([])
80
+ expect(queue).to receive(:receive_messages).with(
81
+ max_number_of_messages: described_class::FETCH_LIMIT, attribute_names: ['All'], message_attribute_names: ['All']
82
+ ).and_return([])
47
83
 
48
84
  subject.fetch(queue_config, limit)
49
85
  end
@@ -97,4 +97,84 @@ RSpec.describe Shoryuken::Options do
97
97
  "and Shoryuken doesn't support a batchable worker for a queue with multiple workers")
98
98
  end
99
99
  end
100
+
101
+ describe '.polling_strategy' do
102
+ context 'when not set' do
103
+ specify do
104
+ expect(Shoryuken.polling_strategy('default')).to eq Shoryuken::Polling::WeightedRoundRobin
105
+ expect(Shoryuken.polling_strategy('group1')).to eq Shoryuken::Polling::WeightedRoundRobin
106
+ end
107
+ end
108
+
109
+ context 'when set to StrictPriority string' do
110
+ before do
111
+ Shoryuken.options[:polling_strategy] = 'StrictPriority'
112
+
113
+ Shoryuken.options[:groups] = {
114
+ 'group1' => {
115
+ polling_strategy: 'StrictPriority'
116
+ }
117
+ }
118
+ end
119
+
120
+ specify do
121
+ expect(Shoryuken.polling_strategy('default')).to eq Shoryuken::Polling::StrictPriority
122
+ expect(Shoryuken.polling_strategy('group1')).to eq Shoryuken::Polling::StrictPriority
123
+ end
124
+ end
125
+
126
+ context 'when set to WeightedRoundRobin string' do
127
+ before do
128
+ Shoryuken.options[:polling_strategy] = 'WeightedRoundRobin'
129
+
130
+ Shoryuken.options[:groups] = {
131
+ 'group1' => {
132
+ polling_strategy: 'WeightedRoundRobin'
133
+ }
134
+ }
135
+ end
136
+
137
+ specify do
138
+ expect(Shoryuken.polling_strategy('default')).to eq Shoryuken::Polling::WeightedRoundRobin
139
+ expect(Shoryuken.polling_strategy('group1')).to eq Shoryuken::Polling::WeightedRoundRobin
140
+ end
141
+ end
142
+
143
+ context 'when set to non-existent string' do
144
+ before do
145
+ Shoryuken.options[:polling_strategy] = 'NonExistent1'
146
+
147
+ Shoryuken.options[:groups] = {
148
+ 'group1' => {
149
+ polling_strategy: 'NonExistent2'
150
+ }
151
+ }
152
+ end
153
+
154
+ specify do
155
+ expect { Shoryuken.polling_strategy('default') }.to raise_error(ArgumentError)
156
+ expect { Shoryuken.polling_strategy('group1') }.to raise_error(ArgumentError)
157
+ end
158
+ end
159
+
160
+ context 'when set to a class' do
161
+ before do
162
+ class Foo < Shoryuken::Polling::BaseStrategy; end
163
+ class Bar < Shoryuken::Polling::BaseStrategy; end
164
+
165
+ Shoryuken.options[:polling_strategy] = Foo
166
+
167
+ Shoryuken.options[:groups] = {
168
+ 'group1' => {
169
+ polling_strategy: Bar
170
+ }
171
+ }
172
+ end
173
+
174
+ specify do
175
+ expect(Shoryuken.polling_strategy('default')).to eq Foo
176
+ expect(Shoryuken.polling_strategy('group1')).to eq Bar
177
+ end
178
+ end
179
+ end
100
180
  end
data/spec/spec_helper.rb CHANGED
@@ -59,6 +59,8 @@ RSpec.configure do |config|
59
59
 
60
60
  Aws.config[:stub_responses] = true
61
61
 
62
+ Shoryuken.sqs_client_receive_message_opts.clear
63
+
62
64
  allow(Concurrent).to receive(:global_io_executor).and_return(Concurrent::ImmediateExecutor.new)
63
65
  allow(Shoryuken).to receive(:active_job?).and_return(false)
64
66
  end
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.6
4
+ version: 3.1.7
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-24 00:00:00.000000000 Z
11
+ date: 2017-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler