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

Simple Message Queue (formerly MNS):キューへのメッセージの送信方法

最終更新日:Jan 13, 2025

このトピックでは、Simple Message Queue(旧称 MNS)(SMQ)SDK for Java を使用してキューにメッセージを送信する方法について説明します。

前提条件

認証情報

デフォルトでは、この操作はAlibaba Cloudアカウントでのみ呼び出すことができます。 Resource Access Management(RAM)ユーザーとしてこの操作を呼び出すには、必要な権限をRAMユーザーに付与する必要があります。 次の表に、この操作の認証情報を示します。

名前

API

SendMessage

アクション

mns:SendMessage

リソース

acs:mns:$region:$accountid:/queues/$queueName/messages

使用上の注意

  • この操作を呼び出して、キューにメッセージを送信できます。 標準メッセージは、キューに送信された直後に消費されます。 メッセージがキューに送信された直後に消費されないようにするには、メッセージの送信時に DelaySeconds パラメーターを指定します。 DelaySeconds パラメーターを 0 より大きい値に設定すると、メッセージがキューに送信された後、メッセージの初期状態は「遅延」になります。 DelaySeconds パラメーターで指定された期間が終了し、メッセージの状態が「アクティブ」に変更されるまで、メッセージは消費できません。

  • メッセージに指定された DelaySeconds パラメーターの値が、キューに指定された DelaySeconds パラメーターの値と異なる場合、メッセージに指定された DelaySeconds パラメーターの値が有効になります。

  • 操作を呼び出してメッセージを送信する場合は、特殊文字によるエラーを防ぐために、メッセージ本文をBase64でエンコードすることをお勧めします。

  • このサンプルコードでは、実際の環境に基づいてエンドポイントを使用できます。 ローカルテストのみを実行する場合は、パブリックエンドポイントを使用できます。 オンラインでメッセージを送信する場合は、内部エンドポイントを使用することをお勧めします。 SMQ でサポートされているリージョンとエンドポイントの詳細については、リージョンとエンドポイントをご参照ください。

メッセージ本文のエンコード方法

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

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

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

サンプルコード

サンプルコードのダウンロード方法の詳細については、SendMessageDemo.java をご参照ください。

import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudQueue;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ClientException;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.common.utils.ServiceSettings;
import com.aliyun.mns.model.Message;

/**
 * 1. Alibaba Cloud の仕様に基づいて、環境内で AccessKey ID と AccessKey Secret を構成します。
 * 2. 次の内容に基づいて、${"user.home"}/.aliyun-mns.properties ファイルを構成します。
 *           mns.endpoint=http://xxxxxxx
 *           mns.msgBodyBase64Switch=true/false
 */
public class SendMessageDemo {

    /**
     * キュー名で置き換えます
     */
    private static final String QUEUE_NAME = "cloud-queue-demo";

    private static final Boolean IS_BASE64 = Boolean.valueOf(ServiceSettings.getMNSPropertyValue("msgBodyBase64Switch","false"));


    public static void main(String[] args) {
        // Alibaba Cloud の仕様に基づいて、環境内で AccessKey ID と AccessKey Secret を構成します。
        CloudAccount account = new CloudAccount(ServiceSettings.getMNSAccountEndpoint());
        MNSClient client = account.getMNSClient();

        // メッセージ送信コードのデモ。 10 件のテストメッセージを送信します。
        try {
            CloudQueue queue = client.getQueueRef(QUEUE_NAME);
            for (int i = 0; i < 10; i++) {
                Message message = new Message();
                String messageValue = "demo_message_body" + i;
                if (IS_BASE64) {
                    // メッセージ本文を Base64 でエンコードします。
                    message.setMessageBody(messageValue);
                }else {
                    // メッセージ本文をエンコードしません。
                    message.setMessageBodyAsRawString(messageValue);
                }

                Message putMsg = queue.putMessage(message);
                System.out.println("Send message id is: " + putMsg.getMessageId());
            }
        } catch (ClientException ce) {
            System.out.println("Something wrong with the network connection between client and MNS service."
                + "Please check your network and DNS availablity.");
            ce.printStackTrace();
        } catch (ServiceException se) {
            if (se.getErrorCode().equals("QueueNotExist")) {
                System.out.println("Queue is not exist. Please create before use");
            } else if (se.getErrorCode().equals("TimeExpired")) {
                System.out.println("The request is time expired. Please check your local machine timeclock");
            }
            se.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknown exception happened!");
            e.printStackTrace();
        }

        client.close();
    }

}