Simple Message Queue (旧称:MNS) の Topic に対して、生(Raw)および Base64 エンコード済みのメッセージを、SMQ SDK for Python を使用して送信します。
前提条件
開始する前に、以下の準備が完了していることを確認してください。
SMQ SDK for Python がインストール済みであること。詳細については、「SDK for Python のインストール」をご参照ください。
エンドポイントおよびアクセス認証情報が構成済みであること。詳細については、「エンドポイントおよびアクセス認証情報の構成」をご参照ください。
本例では、エンドポイントは sample.cfg 構成ファイルから読み込まれます。AccessKey ペアおよびセキュリティトークンは、環境変数から読み込まれます。完全なサンプルコードをダウンロードするには、「概要」トピックの「サンプルコード」セクションをご参照ください。
メッセージ本文のエンコーディング方式
SMQ では、メッセージ本文のエンコーディングとして以下の 2 種類の方式をサポートしています。
| 方式 | クラス | 動作 |
|---|---|---|
| 生 | TopicMessage | メッセージ本文をエンコーディングせずにそのまま送信します。 |
| Base64 | Base64TopicMessage | 送信前にメッセージ本文を Base64 エンコードします。 |
エンコーディング方式の選択方法については、「メッセージ本文のエンコーディング方式の選択」をご参照ください。
メッセージの送信
publish_message.py ファイルを実行して、Topic へメッセージを送信します。
python publish_message.py MyTopic1期待される出力結果:
==========Topic へのメッセージ送信==========
TopicName:MyTopic1
MessageCount:3
Publish Raw Message Succeed. MessageBody:I am test message 0. MessageID:4EA4CF419C3A7FC67FA95077****0001
Publish Raw Message Succeed. MessageBody:I am test message 1. MessageID:4EA4CF419C3A7FC67FA95077****0002
Publish Raw Message Succeed. MessageBody:I am test message 2. MessageID:4EA4CF419C3A7FC67FA95077****0003
Publish Base64 Encoded Message Succeed. MessageBody:I am test message 0. MessageID:4EA4CF419C3A7FC67FA95077****0004
Publish Base64 Encoded Message Succeed. MessageBody:I am test message 1. MessageID:4EA4CF419C3A7FC67FA95077****0005
Publish Base64 Encoded Message Succeed. MessageBody:I am test message 2. MessageID:4EA4CF419C3A7FC67FA95077****0006このスクリプトでは、MyTopic1 に対して生(Raw)メッセージを 3 件、Base64 エンコード済みメッセージを 3 件、合計 6 件送信します。
コードの解説
publish_message.py のコアコードでは、以下の 3 つのステップを実行します:アカウントの初期化、生(Raw)メッセージの送信、Base64 エンコード済みメッセージの送信。
ステップ 1:アカウントの初期化と Topic の取得
エンドポイントおよび認証情報を用いて Account オブジェクトを作成し、対象 Topic の参照を取得します。
my_account = Account(endpoint, accid, acckey, token)
topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
my_topic = my_account.get_topic(topic_name)| パラメーター | 説明 |
|---|---|
endpoint | SMQ サービスのエンドポイント。この値は sample.cfg ファイルからロードされます。 |
accid | AccessKey ID。この値は環境変数からロードされます。 |
acckey | AccessKey Secret。この値は環境変数からロードされます。 |
token | セキュリティトークン。この値は環境変数からロードされます。 |
topic_name | 対象 Topic の名前。コマンドライン引数が指定されていない場合は、デフォルトで MySampleTopic が使用されます。 |
ステップ 2:生(Raw)メッセージの送信
TopicMessage を使用して、エンコーディングを行わずにメッセージを送信します。
msg_count = 3
for i in range(msg_count):
try:
msg_body = u"I am test message %s." % i
msg = TopicMessage(msg_body)
re_msg = my_topic.publish_message(msg)
print("Publish Raw Message Succeed. MessageBody:%s MessageID:%s" % (msg_body, re_msg.message_id))
except MNSExceptionBase as e:
if e.type == "TopicNotExist":
print("Topic not exist, please create it.")
sys.exit(1)
print("Publish Raw Message Fail. Exception:%s" % e)TopicMessage(msg_body)は、メッセージ本文を生(Raw)形式(エンコーディングなし)でラップします。my_topic.publish_message(msg)は、メッセージを Topic に送信し、message_idを含む応答を返します。Topic が存在しない場合、SDK は
MNSExceptionBaseを発生させ、そのe.type属性が"TopicNotExist"に設定されます。
ステップ 3:Base64 エンコード済みメッセージの送信
Base64TopicMessage を使用して、送信前にメッセージ本文を Base64 エンコードします。
for i in range(msg_count):
try:
msg_body = u"I am test message %s." % i
msg = Base64TopicMessage(msg_body)
re_msg = my_topic.publish_message(msg)
print("Publish Base64 Encoded Message Succeed. MessageBody:%s MessageID:%s" % (msg_body, re_msg.message_id))
except MNSExceptionBase as e:
if e.type == "TopicNotExist":
print("Topic not exist, please create it.")
sys.exit(1)
print("Publish Base64 Encoded Message Fail. Exception:%s" % e)ステップ 2 との唯一の違いは、使用するメッセージクラスです。Base64TopicMessage は、送信前にメッセージ本文を自動的に Base64 エンコードします。
エラー処理
コードでは、MNSExceptionBase をキャッチし、e.type 属性をチェックしてエラーの種類を特定します。
| エラー種別 | 原因 | 対応方法 |
|---|---|---|
TopicNotExist | 指定された Topic が存在しません。 | まず Topic を作成し、その後再試行してください。 |
| その他の種別 | ネットワーク障害、認証失敗、その他のサービス障害など | 例外メッセージを確認して、詳細を確認してください。 |
次のステップ
メッセージ本文のエンコーディング方式 について学習します。
概要 トピックの「サンプルコード」セクションから、完全なサンプルコードをダウンロードします。