すべてのプロダクト
Search
ドキュメントセンター

Simple Message Queue (formerly MNS):SMQ SDK for Python を使用したキュー メッセージの管理

最終更新日:Feb 28, 2026

Simple Message Queue (旧称:MNS) キューに対して、Python SDK を使用してメッセージの送信、受信、および削除を行います。

前提条件

開始する前に、以下の準備が完了していることを確認してください。

重要

以降の例では、エンドポイントは sample.cfg 構成ファイルから読み込まれ、AccessKey ペアおよびセキュリティトークンは環境変数から読み込まれます。完全なサンプルコードをダウンロードするには、「概要」の「サンプルコード」セクションをご参照ください。

SDK クラス

SMQ Python SDK では、キュー リソースと連携するために 3 つのコアクラスが使用されます。

クラス役割
Accountエントリポイント。エンドポイントおよび認証情報を用いた SMQ への認証済み接続を表します
QueueAccount から作成されます。メッセージの送信、受信、および削除を行うためのメソッドを提供します
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. アカウントの初期化とキューの取得

1. Analysis of the English text structure and meaning: This is a Python code block showing how to send messages to a queue using Alibaba Cloud MNS (Message Notification Service). It includes variable initialization, queue creation, message sending loop, and error handling. 2. Identification of technical terms and their proper translations: - "Account" → "Account" (class name, keep as-is) - "endpoint", "accid", "acckey", "token" → these are parameter names, keep in English - "queue_name" → "queue_name" (variable name, keep as-is) - "MySampleQueue" → "MySampleQueue" (string literal, keep as-is) - "get_queue" → "get_queue" (method name, keep as-is) - "msg_count" → "msg_count" (variable name, keep as-is) - "Send Message To Queue" → "メッセージをキューに送信" (action description) - "QueueName" → "キュー名" - "MessageCount" → "メッセージ数" - "MessageBody" → "メッセージ本文" - "MessageID" → "メッセージID" - "ReceiptHandle" → "受信ハンドル" - "QueueNotExist" → "QueueNotExist" (error type, keep as-is) - "Queue not exist, please create queue before send message." → "キューが存在しません。メッセージを送信する前にキューを作成してください。" - "Send Message Succeed!" → "メッセージの送信に成功しました!" - "Send Message Fail!" → "メッセージの送信に失敗しました!" 3. Consideration of context and tone: This is a code example with comments and print statements. The comments and print statements need to be translated, but the code itself (variable names, method names, string literals like "MySampleQueue") should remain in English as they are part of the code syntax. 4. Draft translation with reasoning: - The code block tag must be preserved exactly. - The Python code itself remains unchanged except for comments and print statements. - The print statements contain English text that needs translation. - The error messages in print statements need translation. - The string "MySampleQueue" remains as-is since it's a literal value. - The variable names and method names remain in English. 5. Optimization and final review: - Verify all technical terms follow standard translations. - Ensure code structure is preserved. - Check that Japanese translations are natural and accurate. - Confirm spacing rules: half-width space between Japanese and English words/numbers. - Ensure HTML attributes are preserved exactly.

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)

参考文献