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

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

最終更新日:Mar 26, 2025

このトピックでは、Simple Message Queue (SMQ) SDK for Python を使用してキューのメッセージを管理するための前提条件とサンプルコードについて説明します。

前提条件

  • SMQ SDK for Python がインストールされていること。詳細については、Python 用 SDK のインストールをご参照ください。

  • エンドポイントとアクセス認証情報が構成されていること。詳細については、エンドポイントとアクセス認証情報の構成をご参照ください。

    重要
    • この例では、エンドポイントはエンドポイント構成に使用される sample.cfg ファイルから取得されます。AccessKey ペアとセキュリティトークンは環境変数から取得されます。

    • サンプルコードのダウンロード方法の詳細については、概要 トピックの「サンプルコード」セクションをご参照ください。

メッセージ本文のエンコード方式を選択する

メッセージ本文に特殊文字が含まれていない場合は、Base64 エンコードを使用しないことをお勧めします。

  • メッセージを送信するには、message.setMessageBodyAsRawString メソッドを使用してメッセージ本文を設定します。

  • メッセージを受信するには、message.getMessageBodyAsRawString メソッドを使用してメッセージ本文を取得します。

メッセージを送信する

  • send_message.py ファイルを実行するには、次のコマンドを実行します。

    python send_message.py MyQueue1

    次の出力が返されます。

    ==========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
  • サンプルコード:

    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 ファイルを実行するには、次のコマンドを実行します。

    python recv_and_del_message.py MyQueue1                

    次の出力が返されます。

    ==========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!
  • サンプルコード:

    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  # base64 エンコードを使用するかどうかを設定
    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:
            # The message body of receive_message is a byte string and the message body of receive_message_with_str_body is a string.  receive_message のメッセージ本文はバイト文字列で、receive_message_with_str_body のメッセージ本文は文字列です。
            # recv_msg = my_queue.receive_message(wait_seconds)
            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)