aws-sdk-sqs 1.63.0 → 1.70.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,8 +32,8 @@ module Aws::SQS
32
32
  raise ArgumentError, "FIPS and DualStack are enabled, but this partition does not support one or both"
33
33
  end
34
34
  if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
35
- if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"))
36
- if Aws::Endpoints::Matchers.string_equals?("aws-us-gov", Aws::Endpoints::Matchers.attr(partition_result, "name"))
35
+ if Aws::Endpoints::Matchers.boolean_equals?(Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"), true)
36
+ if Aws::Endpoints::Matchers.string_equals?(Aws::Endpoints::Matchers.attr(partition_result, "name"), "aws-us-gov")
37
37
  return Aws::Endpoints::Endpoint.new(url: "https://sqs.#{region}.amazonaws.com", headers: {}, properties: {})
38
38
  end
39
39
  return Aws::Endpoints::Endpoint.new(url: "https://sqs-fips.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
@@ -30,10 +30,20 @@ module Aws::SQS
30
30
  # * {BatchEntryIdsNotDistinct}
31
31
  # * {BatchRequestTooLong}
32
32
  # * {EmptyBatchRequest}
33
+ # * {InvalidAddress}
33
34
  # * {InvalidAttributeName}
35
+ # * {InvalidAttributeValue}
34
36
  # * {InvalidBatchEntryId}
35
37
  # * {InvalidIdFormat}
36
38
  # * {InvalidMessageContents}
39
+ # * {InvalidSecurity}
40
+ # * {KmsAccessDenied}
41
+ # * {KmsDisabled}
42
+ # * {KmsInvalidKeyUsage}
43
+ # * {KmsInvalidState}
44
+ # * {KmsNotFound}
45
+ # * {KmsOptInRequired}
46
+ # * {KmsThrottled}
37
47
  # * {MessageNotInflight}
38
48
  # * {OverLimit}
39
49
  # * {PurgeQueueInProgress}
@@ -41,6 +51,7 @@ module Aws::SQS
41
51
  # * {QueueDoesNotExist}
42
52
  # * {QueueNameExists}
43
53
  # * {ReceiptHandleIsInvalid}
54
+ # * {RequestThrottled}
44
55
  # * {ResourceNotFoundException}
45
56
  # * {TooManyEntriesInBatchRequest}
46
57
  # * {UnsupportedOperation}
@@ -59,6 +70,11 @@ module Aws::SQS
59
70
  def initialize(context, message, data = Aws::EmptyStructure.new)
60
71
  super(context, message, data)
61
72
  end
73
+
74
+ # @return [String]
75
+ def message
76
+ @message || @data[:message]
77
+ end
62
78
  end
63
79
 
64
80
  class BatchRequestTooLong < ServiceError
@@ -69,6 +85,11 @@ module Aws::SQS
69
85
  def initialize(context, message, data = Aws::EmptyStructure.new)
70
86
  super(context, message, data)
71
87
  end
88
+
89
+ # @return [String]
90
+ def message
91
+ @message || @data[:message]
92
+ end
72
93
  end
73
94
 
74
95
  class EmptyBatchRequest < ServiceError
@@ -79,6 +100,26 @@ module Aws::SQS
79
100
  def initialize(context, message, data = Aws::EmptyStructure.new)
80
101
  super(context, message, data)
81
102
  end
103
+
104
+ # @return [String]
105
+ def message
106
+ @message || @data[:message]
107
+ end
108
+ end
109
+
110
+ class InvalidAddress < ServiceError
111
+
112
+ # @param [Seahorse::Client::RequestContext] context
113
+ # @param [String] message
114
+ # @param [Aws::SQS::Types::InvalidAddress] data
115
+ def initialize(context, message, data = Aws::EmptyStructure.new)
116
+ super(context, message, data)
117
+ end
118
+
119
+ # @return [String]
120
+ def message
121
+ @message || @data[:message]
122
+ end
82
123
  end
83
124
 
84
125
  class InvalidAttributeName < ServiceError
@@ -89,6 +130,26 @@ module Aws::SQS
89
130
  def initialize(context, message, data = Aws::EmptyStructure.new)
90
131
  super(context, message, data)
91
132
  end
133
+
134
+ # @return [String]
135
+ def message
136
+ @message || @data[:message]
137
+ end
138
+ end
139
+
140
+ class InvalidAttributeValue < ServiceError
141
+
142
+ # @param [Seahorse::Client::RequestContext] context
143
+ # @param [String] message
144
+ # @param [Aws::SQS::Types::InvalidAttributeValue] data
145
+ def initialize(context, message, data = Aws::EmptyStructure.new)
146
+ super(context, message, data)
147
+ end
148
+
149
+ # @return [String]
150
+ def message
151
+ @message || @data[:message]
152
+ end
92
153
  end
93
154
 
94
155
  class InvalidBatchEntryId < ServiceError
@@ -99,6 +160,11 @@ module Aws::SQS
99
160
  def initialize(context, message, data = Aws::EmptyStructure.new)
100
161
  super(context, message, data)
101
162
  end
163
+
164
+ # @return [String]
165
+ def message
166
+ @message || @data[:message]
167
+ end
102
168
  end
103
169
 
104
170
  class InvalidIdFormat < ServiceError
@@ -119,6 +185,131 @@ module Aws::SQS
119
185
  def initialize(context, message, data = Aws::EmptyStructure.new)
120
186
  super(context, message, data)
121
187
  end
188
+
189
+ # @return [String]
190
+ def message
191
+ @message || @data[:message]
192
+ end
193
+ end
194
+
195
+ class InvalidSecurity < ServiceError
196
+
197
+ # @param [Seahorse::Client::RequestContext] context
198
+ # @param [String] message
199
+ # @param [Aws::SQS::Types::InvalidSecurity] data
200
+ def initialize(context, message, data = Aws::EmptyStructure.new)
201
+ super(context, message, data)
202
+ end
203
+
204
+ # @return [String]
205
+ def message
206
+ @message || @data[:message]
207
+ end
208
+ end
209
+
210
+ class KmsAccessDenied < ServiceError
211
+
212
+ # @param [Seahorse::Client::RequestContext] context
213
+ # @param [String] message
214
+ # @param [Aws::SQS::Types::KmsAccessDenied] data
215
+ def initialize(context, message, data = Aws::EmptyStructure.new)
216
+ super(context, message, data)
217
+ end
218
+
219
+ # @return [String]
220
+ def message
221
+ @message || @data[:message]
222
+ end
223
+ end
224
+
225
+ class KmsDisabled < ServiceError
226
+
227
+ # @param [Seahorse::Client::RequestContext] context
228
+ # @param [String] message
229
+ # @param [Aws::SQS::Types::KmsDisabled] data
230
+ def initialize(context, message, data = Aws::EmptyStructure.new)
231
+ super(context, message, data)
232
+ end
233
+
234
+ # @return [String]
235
+ def message
236
+ @message || @data[:message]
237
+ end
238
+ end
239
+
240
+ class KmsInvalidKeyUsage < ServiceError
241
+
242
+ # @param [Seahorse::Client::RequestContext] context
243
+ # @param [String] message
244
+ # @param [Aws::SQS::Types::KmsInvalidKeyUsage] data
245
+ def initialize(context, message, data = Aws::EmptyStructure.new)
246
+ super(context, message, data)
247
+ end
248
+
249
+ # @return [String]
250
+ def message
251
+ @message || @data[:message]
252
+ end
253
+ end
254
+
255
+ class KmsInvalidState < ServiceError
256
+
257
+ # @param [Seahorse::Client::RequestContext] context
258
+ # @param [String] message
259
+ # @param [Aws::SQS::Types::KmsInvalidState] data
260
+ def initialize(context, message, data = Aws::EmptyStructure.new)
261
+ super(context, message, data)
262
+ end
263
+
264
+ # @return [String]
265
+ def message
266
+ @message || @data[:message]
267
+ end
268
+ end
269
+
270
+ class KmsNotFound < ServiceError
271
+
272
+ # @param [Seahorse::Client::RequestContext] context
273
+ # @param [String] message
274
+ # @param [Aws::SQS::Types::KmsNotFound] data
275
+ def initialize(context, message, data = Aws::EmptyStructure.new)
276
+ super(context, message, data)
277
+ end
278
+
279
+ # @return [String]
280
+ def message
281
+ @message || @data[:message]
282
+ end
283
+ end
284
+
285
+ class KmsOptInRequired < ServiceError
286
+
287
+ # @param [Seahorse::Client::RequestContext] context
288
+ # @param [String] message
289
+ # @param [Aws::SQS::Types::KmsOptInRequired] data
290
+ def initialize(context, message, data = Aws::EmptyStructure.new)
291
+ super(context, message, data)
292
+ end
293
+
294
+ # @return [String]
295
+ def message
296
+ @message || @data[:message]
297
+ end
298
+ end
299
+
300
+ class KmsThrottled < ServiceError
301
+
302
+ # @param [Seahorse::Client::RequestContext] context
303
+ # @param [String] message
304
+ # @param [Aws::SQS::Types::KmsThrottled] data
305
+ def initialize(context, message, data = Aws::EmptyStructure.new)
306
+ super(context, message, data)
307
+ end
308
+
309
+ # @return [String]
310
+ def message
311
+ @message || @data[:message]
312
+ end
122
313
  end
123
314
 
124
315
  class MessageNotInflight < ServiceError
@@ -139,6 +330,11 @@ module Aws::SQS
139
330
  def initialize(context, message, data = Aws::EmptyStructure.new)
140
331
  super(context, message, data)
141
332
  end
333
+
334
+ # @return [String]
335
+ def message
336
+ @message || @data[:message]
337
+ end
142
338
  end
143
339
 
144
340
  class PurgeQueueInProgress < ServiceError
@@ -149,6 +345,11 @@ module Aws::SQS
149
345
  def initialize(context, message, data = Aws::EmptyStructure.new)
150
346
  super(context, message, data)
151
347
  end
348
+
349
+ # @return [String]
350
+ def message
351
+ @message || @data[:message]
352
+ end
152
353
  end
153
354
 
154
355
  class QueueDeletedRecently < ServiceError
@@ -159,6 +360,11 @@ module Aws::SQS
159
360
  def initialize(context, message, data = Aws::EmptyStructure.new)
160
361
  super(context, message, data)
161
362
  end
363
+
364
+ # @return [String]
365
+ def message
366
+ @message || @data[:message]
367
+ end
162
368
  end
163
369
 
164
370
  class QueueDoesNotExist < ServiceError
@@ -169,6 +375,11 @@ module Aws::SQS
169
375
  def initialize(context, message, data = Aws::EmptyStructure.new)
170
376
  super(context, message, data)
171
377
  end
378
+
379
+ # @return [String]
380
+ def message
381
+ @message || @data[:message]
382
+ end
172
383
  end
173
384
 
174
385
  class QueueNameExists < ServiceError
@@ -179,6 +390,11 @@ module Aws::SQS
179
390
  def initialize(context, message, data = Aws::EmptyStructure.new)
180
391
  super(context, message, data)
181
392
  end
393
+
394
+ # @return [String]
395
+ def message
396
+ @message || @data[:message]
397
+ end
182
398
  end
183
399
 
184
400
  class ReceiptHandleIsInvalid < ServiceError
@@ -189,6 +405,26 @@ module Aws::SQS
189
405
  def initialize(context, message, data = Aws::EmptyStructure.new)
190
406
  super(context, message, data)
191
407
  end
408
+
409
+ # @return [String]
410
+ def message
411
+ @message || @data[:message]
412
+ end
413
+ end
414
+
415
+ class RequestThrottled < ServiceError
416
+
417
+ # @param [Seahorse::Client::RequestContext] context
418
+ # @param [String] message
419
+ # @param [Aws::SQS::Types::RequestThrottled] data
420
+ def initialize(context, message, data = Aws::EmptyStructure.new)
421
+ super(context, message, data)
422
+ end
423
+
424
+ # @return [String]
425
+ def message
426
+ @message || @data[:message]
427
+ end
192
428
  end
193
429
 
194
430
  class ResourceNotFoundException < ServiceError
@@ -199,6 +435,11 @@ module Aws::SQS
199
435
  def initialize(context, message, data = Aws::EmptyStructure.new)
200
436
  super(context, message, data)
201
437
  end
438
+
439
+ # @return [String]
440
+ def message
441
+ @message || @data[:message]
442
+ end
202
443
  end
203
444
 
204
445
  class TooManyEntriesInBatchRequest < ServiceError
@@ -209,6 +450,11 @@ module Aws::SQS
209
450
  def initialize(context, message, data = Aws::EmptyStructure.new)
210
451
  super(context, message, data)
211
452
  end
453
+
454
+ # @return [String]
455
+ def message
456
+ @message || @data[:message]
457
+ end
212
458
  end
213
459
 
214
460
  class UnsupportedOperation < ServiceError
@@ -219,6 +465,11 @@ module Aws::SQS
219
465
  def initialize(context, message, data = Aws::EmptyStructure.new)
220
466
  super(context, message, data)
221
467
  end
468
+
469
+ # @return [String]
470
+ def message
471
+ @message || @data[:message]
472
+ end
222
473
  end
223
474
 
224
475
  end
@@ -14,6 +14,7 @@ module Aws::SQS
14
14
  option(
15
15
  :endpoint_provider,
16
16
  doc_type: 'Aws::SQS::EndpointProvider',
17
+ rbs_type: 'untyped',
17
18
  docstring: 'The endpoint provider used to resolve endpoints. Any '\
18
19
  'object that responds to `#resolve_endpoint(parameters)` '\
19
20
  'where `parameters` is a Struct similar to '\
@@ -25,16 +26,17 @@ module Aws::SQS
25
26
  # @api private
26
27
  class Handler < Seahorse::Client::Handler
27
28
  def call(context)
28
- # If endpoint was discovered, do not resolve or apply the endpoint.
29
29
  unless context[:discovered_endpoint]
30
30
  params = parameters_for_operation(context)
31
31
  endpoint = context.config.endpoint_provider.resolve_endpoint(params)
32
32
 
33
33
  context.http_request.endpoint = endpoint.url
34
34
  apply_endpoint_headers(context, endpoint.headers)
35
+
36
+ context[:endpoint_params] = params
37
+ context[:endpoint_properties] = endpoint.properties
35
38
  end
36
39
 
37
- context[:endpoint_params] = params
38
40
  context[:auth_scheme] =
39
41
  Aws::Endpoints.resolve_auth_scheme(context, endpoint)
40
42
 
@@ -4,7 +4,6 @@ require 'set'
4
4
 
5
5
  module Aws
6
6
  module SQS
7
-
8
7
  # A utility class for long polling messages in a loop. **Messages are
9
8
  # automatically deleted from the queue at the end of the given block.**
10
9
  #
@@ -181,6 +180,16 @@ module Aws
181
180
  # end
182
181
  # ```
183
182
  #
183
+ # * Configure an {#after_empty_receive} callback.
184
+ #
185
+ # ```
186
+ # poller.after_empty_receive do |stats|
187
+ # logger.info("requests: #{stats.request_count}")
188
+ # logger.info("messages: #{stats.received_message_count}")
189
+ # logger.info("last-timestamp: #{stats.last_message_received_at}")
190
+ # end
191
+ # ```
192
+ #
184
193
  # * Accept a 2nd argument in the poll block, for example:
185
194
  #
186
195
  # ```
@@ -203,7 +212,6 @@ module Aws
203
212
  # ```
204
213
  #
205
214
  class QueuePoller
206
-
207
215
  # @param [String] queue_url
208
216
  # @option options [Client] :client
209
217
  # @option (see #poll)
@@ -258,6 +266,21 @@ module Aws
258
266
  @default_config = @default_config.with(before_request: block) if block_given?
259
267
  end
260
268
 
269
+ # Registers a callback that is invoked when the poll requests returns with no messages.
270
+ # This callback is invoked after the idle timeout is checked.
271
+ #
272
+ # poller.after_empty_receive do |stats|
273
+ # # Handle empty receive
274
+ # end
275
+ #
276
+ # @yieldparam [PollerStats] stats An object that tracks a few
277
+ # client-side statistics about the queue polling.
278
+ #
279
+ # @return [void]
280
+ def after_empty_receive(&block)
281
+ @default_config = @default_config.with(after_empty_receive: block) if block_given?
282
+ end
283
+
261
284
  # Polls the queue, yielded a message, or an array of messages.
262
285
  # Messages are automatically deleted from the queue at the
263
286
  # end of the given block. See the class documentation on
@@ -333,7 +356,8 @@ module Aws
333
356
  loop do
334
357
  messages = get_messages(config, stats)
335
358
  if messages.empty?
336
- check_idle_timeout(config, stats, messages)
359
+ check_idle_timeout(config, stats)
360
+ config.after_empty_receive&.call(stats)
337
361
  else
338
362
  process_messages(config, stats, messages, &block)
339
363
  end
@@ -348,21 +372,21 @@ module Aws
348
372
  # `#receipt_handle`.
349
373
  # @param [Integer] seconds
350
374
  def change_message_visibility_timeout(message, seconds)
351
- @client.change_message_visibility({
375
+ @client.change_message_visibility(
352
376
  queue_url: @queue_url,
353
377
  receipt_handle: message.receipt_handle,
354
- visibility_timeout: seconds,
355
- })
378
+ visibility_timeout: seconds
379
+ )
356
380
  end
357
381
 
358
382
  # @note This method should be called from inside a {#poll} block.
359
383
  # @param [#receipt_handle] message An object that responds to
360
384
  # `#receipt_handle`.
361
385
  def delete_message(message)
362
- @client.delete_message({
386
+ @client.delete_message(
363
387
  queue_url: @queue_url,
364
- receipt_handle: message.receipt_handle,
365
- })
388
+ receipt_handle: message.receipt_handle
389
+ )
366
390
  end
367
391
 
368
392
  # @note This method should be called from inside a {#poll} block.
@@ -372,16 +396,16 @@ module Aws
372
396
  def delete_messages(messages)
373
397
  @client.delete_message_batch(
374
398
  queue_url: @queue_url,
375
- entries: messages.map { |msg|
399
+ entries: messages.map do |msg|
376
400
  { id: msg.message_id, receipt_handle: msg.receipt_handle }
377
- }
401
+ end
378
402
  )
379
403
  end
380
404
 
381
405
  private
382
406
 
383
407
  def get_messages(config, stats)
384
- config.before_request.call(stats) if config.before_request
408
+ config.before_request&.call(stats)
385
409
  messages = send_request(config).messages
386
410
  stats.request_count += 1
387
411
  messages
@@ -392,17 +416,22 @@ module Aws
392
416
  @client.receive_message(params)
393
417
  end
394
418
 
395
- def check_idle_timeout(config, stats, messages)
396
- if config.idle_timeout
397
- since = stats.last_message_received_at || stats.polling_started_at
398
- idle_time = Time.now - since
399
- throw :stop_polling if idle_time > config.idle_timeout
400
- end
419
+ def check_idle_timeout(config, stats)
420
+ return unless config.idle_timeout
421
+
422
+ since = stats.last_message_received_at || stats.polling_started_at
423
+ idle_time = Time.now - since
424
+ throw :stop_polling if idle_time > config.idle_timeout
401
425
  end
402
426
 
403
427
  def process_messages(config, stats, messages, &block)
404
428
  stats.received_message_count += messages.count
405
429
  stats.last_message_received_at = Time.now
430
+
431
+ # duplicated messages will have a different receipt handle
432
+ # so we need to provide the most recent receipt to
433
+ # delete a batch - thus, filtering below by message_id
434
+ messages = messages.reverse.uniq(&:message_id).reverse!
406
435
  catch(:skip_delete) do
407
436
  yield_messages(config, messages, stats, &block)
408
437
  delete_messages(messages) unless config.skip_delete
@@ -421,7 +450,6 @@ module Aws
421
450
 
422
451
  # Statistics tracked client-side by the {QueuePoller}.
423
452
  class PollerStats
424
-
425
453
  def initialize
426
454
  @request_count = 0
427
455
  @received_message_count = 0
@@ -444,27 +472,26 @@ module Aws
444
472
 
445
473
  # @return [Time,nil]
446
474
  attr_accessor :polling_stopped_at
447
-
448
475
  end
449
476
 
450
477
  # A read-only set of configuration used by the QueuePoller.
451
478
  class PollerConfig
452
-
453
479
  # @api private
454
- CONFIG_OPTIONS = Set.new([
455
- :idle_timeout,
456
- :skip_delete,
457
- :before_request,
458
- ])
480
+ CONFIG_OPTIONS = Set.new %i[
481
+ idle_timeout
482
+ skip_delete
483
+ before_request
484
+ after_empty_receive
485
+ ]
459
486
 
460
487
  # @api private
461
- PARAM_OPTIONS = Set.new([
462
- :wait_time_seconds,
463
- :max_number_of_messages,
464
- :visibility_timeout,
465
- :attribute_names,
466
- :message_attribute_names,
467
- ])
488
+ PARAM_OPTIONS = Set.new %i[
489
+ wait_time_seconds
490
+ max_number_of_messages
491
+ visibility_timeout
492
+ attribute_names
493
+ message_attribute_names
494
+ ]
468
495
 
469
496
  # @return [Integer,nil]
470
497
  attr_reader :idle_timeout
@@ -475,6 +502,9 @@ module Aws
475
502
  # @return [Proc,nil]
476
503
  attr_reader :before_request
477
504
 
505
+ # @return [Proc,nil]
506
+ attr_reader :after_empty_receive
507
+
478
508
  # @return [Hash]
479
509
  attr_reader :request_params
480
510
 
@@ -482,12 +512,13 @@ module Aws
482
512
  @idle_timeout = nil
483
513
  @skip_delete = false
484
514
  @before_request = nil
515
+ @after_empty_receive = nil
485
516
  @request_params = {
486
517
  wait_time_seconds: 20,
487
518
  max_number_of_messages: 1,
488
519
  visibility_timeout: nil,
489
520
  attribute_names: ['All'],
490
- message_attribute_names: ['All'],
521
+ message_attribute_names: ['All']
491
522
  }
492
523
  options.each do |opt_name, value|
493
524
  if CONFIG_OPTIONS.include?(opt_name)
@@ -522,7 +553,6 @@ module Aws
522
553
  PARAM_OPTIONS.each { |key| hash[key] = @request_params[key] }
523
554
  hash
524
555
  end
525
-
526
556
  end
527
557
  end
528
558
  end