このトピックでは、Simple Message Queue(旧称 MNS)(SMQ)SDK for Java を使用してキューにメッセージを送信する方法について説明します。
前提条件
SMQ SDK for Java がインストールされていること。 詳細については、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();
}
}