Send, receive, and delete messages in an SMQ queue using the Python SDK.
Prerequisites
Ensure that:
-
The SMQ SDK for Python is installed. Install SDK for Python
-
An endpoint and access credentials are configured. Configure endpoints and access credentials
The following examples load the endpoint from sample.cfg and the AccessKey pair and security token from environment variables. Download the complete sample code from Overview.
SDK classes
The SMQ Python SDK uses three core classes:
| Class | Role |
|---|---|
Account |
Entry point. Connects to SMQ with an endpoint and credentials |
Queue |
Created from Account. Provides methods to send, receive, and delete messages |
Message |
Represents a single message with a body, message ID, and receipt handle |
Typical initialization:
from mns.account import Account
my_account = Account(endpoint, accid, acckey, token)
my_queue = my_account.get_queue("<queue-name>")
Message body encoding
Skip Base64 encoding if the message body contains no special characters.
-
Send without Base64: Call
message.setMessageBodyAsRawStringto set the message body as a raw string. -
Receive without Base64: Call
message.getMessageBodyAsRawStringto retrieve the raw string body.
By default, the SDK uses Base64 encoding. To disable it on the receiving side, call my_queue.set_encoding(False).
Send messages
send_message.py sends messages to a queue.
Run the script
python send_message.py <queue-name>
Replace <queue-name> with your queue name. Defaults to MySampleQueue.
Expected output
==========Send Message To Queue==========
QueueName:MyQueue1
MessageCount:3
Send Message Succeed! MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Send Message Succeed! MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Send Message Succeed! MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002
Code walkthrough
1. Initialize the account and get the queue.
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)
2. Create and send a message.
msg_body = u"I am test message 0."
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)
The returned re_msg object contains the message_id assigned by SMQ.
3. Handle errors.
except MNSExceptionBase as e:
if e.type == "QueueNotExist":
print("Queue not exist, please create queue before send message.")
sys.exit(0)
print("Send Message Fail! Exception:%s\n" % e)
If the queue does not exist, the SDK raises an MNSExceptionBase with e.type set to QueueNotExist.
Complete core code
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
my_queue = my_account.get_queue(queue_name)
msg_count = 3
print("%sSend Message To Queue%s\nQueueName:%s\nMessageCount:%s\n" % (10*"=", 10*"=", queue_name, msg_count))
for i in range(msg_count):
try:
msg_body = u"I am test message %s." % i
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)
print("Send Message Succeed! MessageBody:%s MessageID:%s ReceiptHandle:%s" % (msg_body, re_msg.message_id, re_msg.receipt_handle))
except MNSExceptionBase as e:
if e.type == "QueueNotExist":
print("Queue not exist, please create queue before send message.")
sys.exit(0)
print("Send Message Fail! Exception:%s\n" % e)
Receive and delete messages
recv_and_del_message.py receives messages with long polling and deletes each one after processing.
Run the script
python recv_and_del_message.py <queue-name>
Replace <queue-name> with your queue name. Defaults to MySampleQueue.
To disable Base64 decoding, pass false as the second argument:
python recv_and_del_message.py <queue-name> false
Expected output
==========Receive And Delete Message From Queue==========
QueueName:MyQueue1
WaitSeconds:3
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 0. MessageID:3EBE662B52BC99BC-1-154BD99CCA7-200000001
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA== MessageBody:I am test message 2. MessageID:3EBE662B52BC99BC-1-154BD99CCF0-200000002
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5NC0xNDYzNDcwNDU4LTEtOA==
Receive Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA== MessageBody:I am test message 1. MessageID:64B92941FC57837F-2-154BD99CCCE-200000001
Delete Message Succeed! ReceiptHandle:1-ODU4OTkzNDU5My0xNDYzNDcwNDU4LTItOA==
Queue is empty!
Code walkthrough
1. Initialize the account, get the queue, and configure encoding.
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)
set_encoding controls Base64 decoding. Pass False to receive raw string bodies.
2. Receive a message with long polling.
wait_seconds = 3
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)
| Parameter | Description |
|---|---|
wait_seconds |
Long polling duration in seconds. Blocks until a message arrives or the timeout expires |
The SDK provides two receive methods:
| Method | Returns |
|---|---|
receive_message(wait_seconds) |
Message body as a byte string |
receive_message_with_str_body(wait_seconds) |
Message body as a string |
Received message attributes:
| Attribute | Description |
|---|---|
recv_msg.receipt_handle |
Handle required to delete the message |
recv_msg.message_body |
Content of the message |
recv_msg.message_id |
Unique message identifier |
3. Delete the message after processing.
my_queue.delete_message(recv_msg.receipt_handle)
Pass the receipt_handle from the received message. Undeleted messages become available to other consumers after the visibility timeout expires.
4. Handle errors.
except Exception as e:
if hasattr(e, 'type'):
if e.type == u"QueueNotExist":
print("Queue not exist, please create queue before receive message.")
sys.exit(0)
elif e.type == u"MessageNotExist":
print("Queue is empty!")
sys.exit(0)
print("Receive Message Fail! Exception:%s\n" % e)
| Error type | Meaning |
|---|---|
QueueNotExist |
The specified queue does not exist. Create it before sending or receiving messages |
MessageNotExist |
No messages are available in the queue. The long polling wait timed out |
Complete core code
my_account = Account(endpoint, accid, acckey, token)
queue_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleQueue"
base64 = False if len(sys.argv) > 2 and sys.argv[2].lower() == "false" else True
my_queue = my_account.get_queue(queue_name)
my_queue.set_encoding(base64)
wait_seconds = 3
print("%sReceive And Delete Message From Queue%s\nQueueName:%s\nWaitSeconds:%s\n" % (10*"=", 10*"=", queue_name, wait_seconds))
while True:
try:
# receive_message returns a byte string body.
# receive_message_with_str_body returns a string body.
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)
print("Receive Message Succeed! ReceiptHandle:%s MessageBody:%s MessageID:%s" % (recv_msg.receipt_handle, recv_msg.message_body, recv_msg.message_id))
except Exception as e:
if hasattr(e, 'type'):
if e.type == u"QueueNotExist":
print("Queue not exist, please create queue before receive message.")
sys.exit(0)
elif e.type == u"MessageNotExist":
print("Queue is empty!")
sys.exit(0)
print("Receive Message Fail! Exception:%s\n" % e)
continue
try:
my_queue.delete_message(recv_msg.receipt_handle)
print("Delete Message Succeed! ReceiptHandle:%s" % recv_msg.receipt_handle)
except Exception as e:
print("Delete Message Fail! Exception:%s\n" % e)