2011-02-05 20:17:47 -08:00
module Fog
module AWS
class SQS
class Real
require 'fog/aws/parsers/sqs/receive_message'
2011-07-19 15:10:26 -05:00
# Get a message from a queue (marks it as unavailable temporarily, but does not remove from queue, see delete_message)
#
# ==== Parameters
# * queue_url<~String> - Url of queue to get message from
# * options<~Hash>:
# * Attributes<~Array> - List of attributes to return, in ['All', 'ApproximateFirstReceiveTimestamp', 'ApproximateReceiveCount', 'SenderId', 'SentTimestamp'], defaults to 'All'
# * MaxNumberOfMessages<~Integer> - Maximum number of messages to return, defaults to 1
# * VisibilityTimeout<~Integer> - Duration, in seconds, to hide message from other receives. In 0..43200, defaults to visibility timeout for queue
#
# ==== See Also
# http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html
#
def receive_message ( queue_url , options = { } )
2011-02-05 20:17:47 -08:00
request ( {
'Action' = > 'ReceiveMessage' ,
'AttributeName' = > 'All' ,
2011-07-19 15:10:26 -05:00
:path = > path_from_queue_url ( queue_url ) ,
2011-02-05 20:17:47 -08:00
:parser = > Fog :: Parsers :: AWS :: SQS :: ReceiveMessage . new
2011-07-19 15:10:26 -05:00
} . merge! ( options ) )
2011-02-05 20:17:47 -08:00
end
end
2011-09-18 23:00:58 +03:00
class Mock
def receive_message ( queue_url , options = { } )
Excon :: Response . new . tap do | response |
if ( queue = data [ :queues ] [ queue_url ] )
max_number_of_messages = options [ 'MaxNumberOfMessages' ] || 1
now = Time . now
2012-01-04 04:00:36 -06:00
messages = [ ]
queue [ :messages ] . values . each do | m |
2011-09-18 23:00:58 +03:00
message_id = m [ 'MessageId' ]
2012-01-04 04:00:36 -06:00
2011-09-18 23:00:58 +03:00
invisible = if ( received_handles = queue [ :receipt_handles ] [ message_id ] )
visibility_timeout = m [ 'Attributes' ] [ 'VisibilityTimeout' ] || queue [ 'Attributes' ] [ 'VisibilityTimeout' ]
received_handles . any? { | handle , time | now < time + visibility_timeout }
else
false
end
2012-01-04 04:00:36 -06:00
unless invisible
2011-09-18 23:00:58 +03:00
receipt_handle = Fog :: Mock . random_base64 ( 300 )
2012-01-04 04:00:36 -06:00
2011-09-18 23:00:58 +03:00
queue [ :receipt_handles ] [ message_id ] || = { }
queue [ :receipt_handles ] [ message_id ] [ receipt_handle ] = now
2012-01-04 04:00:36 -06:00
2011-09-18 23:00:58 +03:00
m [ 'Attributes' ] . tap do | attrs |
attrs [ 'ApproximateFirstReceiveTimestamp' ] || = now
attrs [ 'ApproximateReceiveCount' ] = ( attrs [ 'ApproximateReceiveCount' ] || 0 ) + 1
end
2012-01-04 04:00:36 -06:00
messages << m . merge ( {
2011-09-18 23:00:58 +03:00
'ReceiptHandle' = > receipt_handle
} )
2012-01-04 04:00:36 -06:00
break if messages . size > = max_number_of_messages
2011-09-18 23:00:58 +03:00
end
2012-01-04 04:00:36 -06:00
end
2011-09-18 23:00:58 +03:00
response . body = {
'ResponseMetadata' = > {
'RequestId' = > Fog :: AWS :: Mock . request_id
} ,
'Message' = > messages
}
response . status = 200
else
response . status = 404
raise ( Excon :: Errors . status_error ( { :expects = > 200 } , response ) )
end
end
end
end
2011-02-05 20:17:47 -08:00
end
end
end