diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py
index 56f4207b2a75..4271bf2a6fc8 100644
--- a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py
+++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py
@@ -481,6 +481,62 @@ def send_message( # type: ignore
except StorageErrorException as error:
process_storage_error(error)
+ @distributed_trace
+ def receive_message(self, **kwargs):
+ # type: (Optional[Any]) -> QueueMessage
+ """Removes one message from the front of the queue.
+
+ When the message is retrieved from the queue, the response includes the message
+ content and a pop_receipt value, which is required to delete the message.
+ The message is not automatically deleted from the queue, but after it has
+ been retrieved, it is not visible to other clients for the time interval
+ specified by the visibility_timeout parameter.
+
+ If the key-encryption-key or resolver field is set on the local service object, the message will be
+ decrypted before being returned.
+
+ :keyword int visibility_timeout:
+ If not specified, the default value is 0. Specifies the
+ new visibility timeout value, in seconds, relative to server time.
+ The value must be larger than or equal to 0, and cannot be
+ larger than 7 days. The visibility timeout of a message cannot be
+ set to a value later than the expiry time. visibility_timeout
+ should be set to a value smaller than the time-to-live value.
+ :keyword int timeout:
+ The server timeout, expressed in seconds.
+ :return:
+ Returns a message from the Queue.
+ :rtype: ~azure.storage.queue.QueueMessage
+
+ .. admonition:: Example:
+
+ .. literalinclude:: ../samples/queue_samples_message.py
+ :start-after: [START receive_one_message]
+ :end-before: [END receive_one_message]
+ :language: python
+ :dedent: 12
+ :caption: Receive one message from the queue.
+ """
+ visibility_timeout = kwargs.pop('visibility_timeout', None)
+ timeout = kwargs.pop('timeout', None)
+ self._config.message_decode_policy.configure(
+ require_encryption=self.require_encryption,
+ key_encryption_key=self.key_encryption_key,
+ resolver=self.key_resolver_function)
+ try:
+ message = self._client.messages.dequeue(
+ number_of_messages=1,
+ visibilitytimeout=visibility_timeout,
+ timeout=timeout,
+ cls=self._config.message_decode_policy,
+ **kwargs
+ )
+ wrapped_message = QueueMessage._from_generated( # pylint: disable=protected-access
+ message[0]) if message != [] else None
+ return wrapped_message
+ except StorageErrorException as error:
+ process_storage_error(error)
+
@distributed_trace
def receive_messages(self, **kwargs):
# type: (Optional[Any]) -> ItemPaged[QueueMessage]
diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py
index 0bf0b9076763..d2d3e49af02c 100644
--- a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py
+++ b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py
@@ -400,6 +400,62 @@ async def send_message( # type: ignore
except StorageErrorException as error:
process_storage_error(error)
+ @distributed_trace_async
+ async def receive_message(self, **kwargs):
+ # type: (Optional[Any]) -> QueueMessage
+ """Removes one message from the front of the queue.
+
+ When the message is retrieved from the queue, the response includes the message
+ content and a pop_receipt value, which is required to delete the message.
+ The message is not automatically deleted from the queue, but after it has
+ been retrieved, it is not visible to other clients for the time interval
+ specified by the visibility_timeout parameter.
+
+ If the key-encryption-key or resolver field is set on the local service object, the message will be
+ decrypted before being returned.
+
+ :keyword int visibility_timeout:
+ If not specified, the default value is 0. Specifies the
+ new visibility timeout value, in seconds, relative to server time.
+ The value must be larger than or equal to 0, and cannot be
+ larger than 7 days. The visibility timeout of a message cannot be
+ set to a value later than the expiry time. visibility_timeout
+ should be set to a value smaller than the time-to-live value.
+ :keyword int timeout:
+ The server timeout, expressed in seconds.
+ :return:
+ Returns a message from the Queue.
+ :rtype: ~azure.storage.queue.QueueMessage
+
+ .. admonition:: Example:
+
+ .. literalinclude:: ../samples/queue_samples_message_async.py
+ :start-after: [START receive_one_message]
+ :end-before: [END receive_one_message]
+ :language: python
+ :dedent: 12
+ :caption: Receive one message from the queue.
+ """
+ visibility_timeout = kwargs.pop('visibility_timeout', None)
+ timeout = kwargs.pop('timeout', None)
+ self._config.message_decode_policy.configure(
+ require_encryption=self.require_encryption,
+ key_encryption_key=self.key_encryption_key,
+ resolver=self.key_resolver_function)
+ try:
+ message = await self._client.messages.dequeue(
+ number_of_messages=1,
+ visibilitytimeout=visibility_timeout,
+ timeout=timeout,
+ cls=self._config.message_decode_policy,
+ **kwargs
+ )
+ wrapped_message = QueueMessage._from_generated( # pylint: disable=protected-access
+ message[0]) if message != [] else None
+ return wrapped_message
+ except StorageErrorException as error:
+ process_storage_error(error)
+
@distributed_trace
def receive_messages(self, **kwargs):
# type: (Optional[Any]) -> AsyncItemPaged[QueueMessage]
diff --git a/sdk/storage/azure-storage-queue/samples/queue_samples_message.py b/sdk/storage/azure-storage-queue/samples/queue_samples_message.py
index f5c72c54a120..79e9a3b4eb23 100644
--- a/sdk/storage/azure-storage-queue/samples/queue_samples_message.py
+++ b/sdk/storage/azure-storage-queue/samples/queue_samples_message.py
@@ -179,7 +179,7 @@ def list_message_pages(self):
finally:
queue.delete_queue()
- def delete_and_clear_messages(self):
+ def receive_one_message_from_queue(self):
# Instantiate a queue client
from azure.storage.queue import QueueClient
queue = QueueClient.from_connection_string(self.connection_string, "myqueue5")
@@ -187,6 +187,34 @@ def delete_and_clear_messages(self):
# Create the queue
queue.create_queue()
+ try:
+ queue.send_message(u"message1")
+ queue.send_message(u"message2")
+ queue.send_message(u"message3")
+
+ # [START receive_one_message]
+ # Pop two messages from the front of the queue
+ message1 = queue.receive_message()
+ message2 = queue.receive_message()
+ # We should see message 3 if we peek
+ message3 = queue.peek_messages()[0]
+
+ print(message1.content)
+ print(message2.content)
+ print(message3.content)
+ # [END receive_one_message]
+
+ finally:
+ queue.delete_queue()
+
+ def delete_and_clear_messages(self):
+ # Instantiate a queue client
+ from azure.storage.queue import QueueClient
+ queue = QueueClient.from_connection_string(self.connection_string, "myqueue6")
+
+ # Create the queue
+ queue.create_queue()
+
try:
# Send messages
queue.send_message(u"message1")
@@ -214,7 +242,7 @@ def delete_and_clear_messages(self):
def peek_messages(self):
# Instantiate a queue client
from azure.storage.queue import QueueClient
- queue = QueueClient.from_connection_string(self.connection_string, "myqueue6")
+ queue = QueueClient.from_connection_string(self.connection_string, "myqueue7")
# Create the queue
queue.create_queue()
@@ -246,7 +274,7 @@ def peek_messages(self):
def update_message(self):
# Instantiate a queue client
from azure.storage.queue import QueueClient
- queue = QueueClient.from_connection_string(self.connection_string, "myqueue7")
+ queue = QueueClient.from_connection_string(self.connection_string, "myqueue8")
# Create the queue
queue.create_queue()
@@ -279,6 +307,7 @@ def update_message(self):
sample.queue_metadata()
sample.send_and_receive_messages()
sample.list_message_pages()
+ sample.receive_one_message_from_queue()
sample.delete_and_clear_messages()
sample.peek_messages()
sample.update_message()
diff --git a/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py b/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py
index 0a73fc1caf8c..539869ef3d58 100644
--- a/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py
+++ b/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py
@@ -149,6 +149,36 @@ async def send_and_receive_messages_async(self):
# Delete the queue
await queue.delete_queue()
+ async def receive_one_message_from_queue(self):
+ # Instantiate a queue client
+ from azure.storage.queue.aio import QueueClient
+ queue = QueueClient.from_connection_string(self.connection_string, "myqueue3")
+
+ # Create the queue
+ async with queue:
+ await queue.create_queue()
+
+ try:
+ await asyncio.gather(
+ queue.send_message(u"message1"),
+ queue.send_message(u"message2"),
+ queue.send_message(u"message3"))
+
+ # [START receive_one_message]
+ # Pop two messages from the front of the queue
+ message1 = await queue.receive_message()
+ message2 = await queue.receive_message()
+ # We should see message 3 if we peek
+ message3 = await queue.peek_messages()
+
+ print(message1.content)
+ print(message2.content)
+ print(message3[0].content)
+ # [END receive_one_message]
+
+ finally:
+ await queue.delete_queue()
+
async def delete_and_clear_messages_async(self):
# Instantiate a queue client
from azure.storage.queue.aio import QueueClient
@@ -256,6 +286,7 @@ async def main():
await sample.set_access_policy_async()
await sample.queue_metadata_async()
await sample.send_and_receive_messages_async()
+ await sample.receive_one_message_from_queue()
await sample.delete_and_clear_messages_async()
await sample.peek_messages_async()
await sample.update_message_async()
diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml
new file mode 100644
index 000000000000..1873e79653f5
--- /dev/null
+++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml
@@ -0,0 +1,318 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:17 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: PUT
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a
+ response:
+ body:
+ string: ''
+ headers:
+ content-length:
+ - '0'
+ date:
+ - Thu, 29 Oct 2020 02:48:17 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFF"
+ headers:
+ cache-control:
+ - no-cache
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:17 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ message1'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages
+ response:
+ body:
+ string: "\uFEFF78d04178-05f5-4c46-af2e-d184e4dfb298Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMTAgAAAAMAAAAAAAAAUo399J2t1gE=Thu,
+ 29 Oct 2020 02:48:18 GMT"
+ headers:
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:17 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: '
+
+ message2'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages
+ response:
+ body:
+ string: "\uFEFF0902bc9d-169b-4e22-9ba2-b81fac7ada71Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMTAgAAAAMAAAAAAAAA4FES9Z2t1gE=Thu,
+ 29 Oct 2020 02:48:18 GMT"
+ headers:
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: '
+
+ message3'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages
+ response:
+ body:
+ string: "\uFEFF095ce0f7-470d-4c97-8512-69eb14a36ff3Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMTAgAAAAMAAAAAAAAAJIQr9Z2t1gE=Thu,
+ 29 Oct 2020 02:48:18 GMT"
+ headers:
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:19 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFF78d04178-05f5-4c46-af2e-d184e4dfb298Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMTAgAAAAMAAAAAAAAArXIjB56t1gE=Thu,
+ 29 Oct 2020 02:48:49 GMT1message1"
+ headers:
+ cache-control:
+ - no-cache
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:19 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFF0902bc9d-169b-4e22-9ba2-b81fac7ada71Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMTAgAAAAMAAAAAAAAAPzc4B56t1gE=Thu,
+ 29 Oct 2020 02:48:49 GMT1message2"
+ headers:
+ cache-control:
+ - no-cache
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:19 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?peekonly=true
+ response:
+ body:
+ string: "\uFEFF095ce0f7-470d-4c97-8512-69eb14a36ff3Thu,
+ 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18
+ GMT0message3"
+ headers:
+ cache-control:
+ - no-cache
+ content-type:
+ - application/xml
+ date:
+ - Thu, 29 Oct 2020 02:48:18 GMT
+ server:
+ - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2018-03-28'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml
new file mode 100644
index 000000000000..bc9191e8d665
--- /dev/null
+++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml
@@ -0,0 +1,247 @@
+interactions:
+- request:
+ body: null
+ headers:
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:29 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: PUT
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7
+ response:
+ body:
+ string: ''
+ headers:
+ content-length: '0'
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-version: '2018-03-28'
+ status:
+ code: 201
+ message: Created
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFF"
+ headers:
+ cache-control: no-cache
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 200
+ message: OK
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+- request:
+ body: '
+
+ message1'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages
+ response:
+ body:
+ string: "\uFEFFc25fa1f7-cb36-4d2a-bf09-6f75389bbc98Thu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMTAgAAAAMAAAAAAAAAv+re+52t1gE=Thu,
+ 29 Oct 2020 02:48:30 GMT"
+ headers:
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 201
+ message: Created
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages
+- request:
+ body: '
+
+ message2'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages
+ response:
+ body:
+ string: "\uFEFF9159ff30-0b69-4916-8efb-7624a7b1acdbThu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMTAgAAAAMAAAAAAAAAi7Do+52t1gE=Thu,
+ 29 Oct 2020 02:48:30 GMT"
+ headers:
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 201
+ message: Created
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages
+- request:
+ body: '
+
+ message3'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '103'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: POST
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages
+ response:
+ body:
+ string: "\uFEFFd39f0f34-a85b-4488-924c-d5cf002f4b68Thu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMTAgAAAAMAAAAAAAAAFyjy+52t1gE=Thu,
+ 29 Oct 2020 02:48:30 GMT"
+ headers:
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 201
+ message: Created
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFFc25fa1f7-cb36-4d2a-bf09-6f75389bbc98Thu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMTAgAAAAMAAAAAAAAAyWndDZ6t1gE=Thu,
+ 29 Oct 2020 02:49:00 GMT1message1"
+ headers:
+ cache-control: no-cache
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 200
+ message: OK
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+ response:
+ body:
+ string: "\uFEFF9159ff30-0b69-4916-8efb-7624a7b1acdbThu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMTAgAAAAMAAAAAAAAAs1bnDZ6t1gE=Thu,
+ 29 Oct 2020 02:49:00 GMT1message2"
+ headers:
+ cache-control: no-cache
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 200
+ message: OK
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Thu, 29 Oct 2020 02:48:30 GMT
+ x-ms-version:
+ - '2018-03-28'
+ method: GET
+ uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?peekonly=true
+ response:
+ body:
+ string: "\uFEFFd39f0f34-a85b-4488-924c-d5cf002f4b68Thu,
+ 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30
+ GMT0message3"
+ headers:
+ cache-control: no-cache
+ content-type: application/xml
+ date: Thu, 29 Oct 2020 02:48:29 GMT
+ server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding: chunked
+ x-ms-version: '2018-03-28'
+ status:
+ code: 200
+ message: OK
+ url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?peekonly=true
+version: 1
diff --git a/sdk/storage/azure-storage-queue/tests/test_queue.py b/sdk/storage/azure-storage-queue/tests/test_queue.py
index d556a12c8509..d6f21a3f03f8 100644
--- a/sdk/storage/azure-storage-queue/tests/test_queue.py
+++ b/sdk/storage/azure-storage-queue/tests/test_queue.py
@@ -50,7 +50,7 @@ def _get_queue_reference(self, qsc, prefix=TEST_QUEUE_PREFIX):
queue = qsc.get_queue_client(queue_name)
return queue
- def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list = None):
+ def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list=None):
queue = self._get_queue_reference(qsc, prefix)
created = queue.create_queue()
if queue_list is not None:
@@ -322,6 +322,38 @@ def test_get_messages(self, resource_group, location, storage_account, storage_a
self.assertIsInstance(message.expires_on, datetime)
self.assertIsInstance(message.next_visible_on, datetime)
+ @GlobalStorageAccountPreparer()
+ def test_receive_one_message(self, resource_group, location, storage_account, storage_account_key):
+ # Action
+ qsc = QueueServiceClient(self.account_url(storage_account, "queue"), storage_account_key)
+ queue_client = self._get_queue_reference(qsc)
+ queue_client.create_queue()
+ self.assertIsNone(queue_client.receive_message())
+
+ queue_client.send_message(u'message1')
+ queue_client.send_message(u'message2')
+ queue_client.send_message(u'message3')
+
+ message1 = queue_client.receive_message()
+ message2 = queue_client.receive_message()
+ peeked_message3 = queue_client.peek_messages()[0]
+
+ # Asserts
+ self.assertIsNotNone(message1)
+ self.assertNotEqual('', message1.id)
+ self.assertEqual(u'message1', message1.content)
+ self.assertNotEqual('', message1.pop_receipt)
+ self.assertEqual(1, message1.dequeue_count)
+
+ self.assertIsNotNone(message2)
+ self.assertNotEqual('', message2.id)
+ self.assertEqual(u'message2', message2.content)
+ self.assertNotEqual('', message2.pop_receipt)
+ self.assertEqual(1, message2.dequeue_count)
+
+ self.assertEqual(u'message3', peeked_message3.content)
+ self.assertEqual(0, peeked_message3.dequeue_count)
+
@GlobalStorageAccountPreparer()
def test_get_messages_with_options(self, resource_group, location, storage_account, storage_account_key):
# Action
diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_async.py b/sdk/storage/azure-storage-queue/tests/test_queue_async.py
index dfc4d008f4de..eea4e4c9f114 100644
--- a/sdk/storage/azure-storage-queue/tests/test_queue_async.py
+++ b/sdk/storage/azure-storage-queue/tests/test_queue_async.py
@@ -62,7 +62,7 @@ def _get_queue_reference(self, qsc, prefix=TEST_QUEUE_PREFIX):
queue = qsc.get_queue_client(queue_name)
return queue
- async def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list = None):
+ async def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list=None):
queue = self._get_queue_reference(qsc, prefix)
created = await queue.create_queue()
if queue_list:
@@ -353,6 +353,38 @@ async def test_get_messages(self, resource_group, location, storage_account, sto
self.assertIsInstance(message.expires_on, datetime)
self.assertIsInstance(message.next_visible_on, datetime)
+ @GlobalStorageAccountPreparer()
+ @AsyncStorageTestCase.await_prepared_test
+ async def test_receive_one_message(self, resource_group, location, storage_account, storage_account_key):
+ # Action
+ qsc = QueueServiceClient(self.account_url(storage_account, "queue"), storage_account_key, transport=AiohttpTestTransport())
+ queue_client = await self._create_queue(qsc)
+ self.assertIsNone(await queue_client.receive_message())
+
+ await queue_client.send_message(u'message1')
+ await queue_client.send_message(u'message2')
+ await queue_client.send_message(u'message3')
+
+ message1 = await queue_client.receive_message()
+ message2 = await queue_client.receive_message()
+ peeked_message3 = await queue_client.peek_messages()
+
+ # Asserts
+ self.assertIsNotNone(message1)
+ self.assertNotEqual('', message1.id)
+ self.assertEqual(u'message1', message1.content)
+ self.assertNotEqual('', message1.pop_receipt)
+ self.assertEqual(1, message1.dequeue_count)
+
+ self.assertIsNotNone(message2)
+ self.assertNotEqual('', message2.id)
+ self.assertEqual(u'message2', message2.content)
+ self.assertNotEqual('', message2.pop_receipt)
+ self.assertEqual(1, message2.dequeue_count)
+
+ self.assertEqual(u'message3', peeked_message3[0].content)
+ self.assertEqual(0, peeked_message3[0].dequeue_count)
+
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_get_messages_with_options(self, resource_group, location, storage_account, storage_account_key):