Simple Message Queue (旧称:MNS) キューに対して、Python SDK を使用してメッセージの送信、受信、および削除を行います。
前提条件
開始する前に、以下の準備が完了していることを確認してください。
SMQ SDK for Python がインストール済みであること。詳細については、「SDK for Python のインストール」をご参照ください。
エンドポイントおよびアクセス認証情報が構成済みであること。詳細については、「エンドポイントおよびアクセス認証情報の構成」をご参照ください。
以降の例では、エンドポイントは sample.cfg 構成ファイルから読み込まれ、AccessKey ペアおよびセキュリティトークンは環境変数から読み込まれます。完全なサンプルコードをダウンロードするには、「概要」の「サンプルコード」セクションをご参照ください。
SDK クラス
SMQ Python SDK では、キュー リソースと連携するために 3 つのコアクラスが使用されます。
| クラス | 役割 |
|---|---|
Account | エントリポイント。エンドポイントおよび認証情報を用いた SMQ への認証済み接続を表します |
Queue | Account から作成されます。メッセージの送信、受信、および削除を行うためのメソッドを提供します |
Message | 本文、メッセージ ID、および受信ハンドルを含む単一のメッセージを表します |
典型的な初期化手順:
from mns.account import Account
my_account = Account(endpoint, accid, acckey, token)
my_queue = my_account.get_queue("<queue-name>")メッセージ本文のエンコーディング方式の選択
メッセージ本文に特殊文字が含まれない場合は、可読性の向上およびオーバーヘッドの低減のため、Base64 エンコーディングをスキップできます。
Base64 エンコーディングなしで送信する場合:
message.setMessageBodyAsRawStringを呼び出して、メッセージ本文を生の文字列として設定します。Base64 エンコーディングなしで受信する場合:
message.getMessageBodyAsRawStringを呼び出して、生の文字列形式の本文を取得します。
デフォルトでは、SDK は Base64 エンコーディングを使用します。受信側で無効化するには、my_queue.set_encoding(False) を呼び出します。
メッセージの送信
send_message.py スクリプトは、指定されたキューにメッセージを送信します。
スクリプトの実行
python send_message.py <queue-name><queue-name> をご利用のキュー名に置き換えます。省略した場合は、スクリプトはデフォルトで MySampleQueue を使用します。
期待される出力
==========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コードの解説
1. アカウントの初期化とキューの取得
2. メッセージの作成および送信
msg_body = u"I am test message 0."
msg = Message(msg_body)
re_msg = my_queue.send_message(msg)返された re_msg オブジェクトには message_id 属性が含まれており、これは SMQ によって割り当てられた一意の識別子です。
3. エラー処理
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)キューが存在しない場合、SDK は MNSExceptionBase を発生させ、e.type に QueueNotExist を設定します。
完全なコアコード
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)メッセージの受信および削除
recv_and_del_message.py スクリプトは、ロングポーリングを使用してキューからメッセージを 1 件ずつ受信し、処理後に各メッセージを削除します。
スクリプトの実行
python recv_and_del_message.py <queue-name><queue-name> をご利用のキュー名に置き換えます。省略した場合は、スクリプトはデフォルトで MySampleQueue を使用します。
Base64 デコードを無効化するには、2 番目の引数として false を指定します。
python recv_and_del_message.py <queue-name> false期待される出力
==========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!コードの解説
1. アカウントの初期化、キューの取得、およびエンコーディングの構成
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 メソッドは、SDK がメッセージ本文に Base64 デコードを適用するかどうかを制御します。False を指定すると、生の文字列形式の本文が受信されます。
2. ロングポーリングによるメッセージの受信
wait_seconds = 3
recv_msg = my_queue.receive_message_with_str_body(wait_seconds)| パラメーター | 説明 |
|---|---|
wait_seconds | ロングポーリングの待機時間(秒単位)。リクエストは、メッセージが到着するかタイムアウトが発生するまでブロックされます |
SDK では、以下の 2 つの受信メソッドが提供されています。
| メソッド | 戻り値 |
|---|---|
receive_message(wait_seconds) | バイト文字列としてのメッセージ本文 |
receive_message_with_str_body(wait_seconds) | 文字列としてのメッセージ本文 |
受信したメッセージは、以下の属性を公開します。
| 属性 | 説明 |
|---|---|
recv_msg.receipt_handle | メッセージを削除するために必要なハンドル |
recv_msg.message_body | メッセージの内容 |
recv_msg.message_id | 一意のメッセージ識別子 |
3. 処理後のメッセージの削除
my_queue.delete_message(recv_msg.receipt_handle)受信したメッセージの receipt_handle を渡します。可視性タイムアウトが有効期限切れになる前にメッセージが削除されない場合、他のコンシューマーがそのメッセージを再び利用可能になります。
4. エラー処理
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)| エラー種別 | 意味 |
|---|---|
QueueNotExist | 指定されたキューが存在しません。メッセージの送信または受信の前に、キューを作成してください |
MessageNotExist | キュー内に利用可能なメッセージがありません。ロングポーリングの待機時間がタイムアウトしました |
完全なコアコード
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 はバイト列文字列形式の本文を返します。
# receive_message_with_str_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)