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

:トピック操作

最終更新日:Mar 22, 2020

トピック操作

このドキュメントでは、CreateTopic、CreateSubscription、PublishMessage、ReceiveMessage、DeleteTopic など、MNS の Java SDK でサンプルコードを使用する方法を紹介します。

1. 事前準備

  1. Java SDK の最新バージョンをダウンロードし、aliyun-sdk-mns-samples フォルダに解凍します。
  2. フォルダ alien-idk-mns-samples の下にある maven プロジェクトをインポートします。
  3. ユーザフォルダー(/home/YOURNAME/)の下に、endpoint、AccessKeyID、AccessKeySecret で構成ファイルを作成します。
  4. ファイルサンプルを設定します。
    1. mns.accountendpoint=http://$accountid.mns.$region.aliyuncs.com
    2. mns.accesskeyid=$your_accesskeyid
    3. mns.accesskeysecret=$your_accesskeysecret
    注意
  • AK $your_accesskeyid $your_accesskeysecret の略称で、上の設定ファイルで Alibaba Cloud Service にアクセスするために使用されます。 AK はメインアカウントまたは RAM アカウントから使用できます。
  • mns.accountendpoint は、Alibaba Cloud Message Service のアクセスポイントです。Message Service コンソールの右上にある [エンドポイントの取得] ボタンをクリックすると取得できます。

2. トピックの作成

サンプルコードでトピックの作成方法を示します。

  1. public class CreateTopicDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient(); // CloudAccount と MNSClient の両方がスレッドセーフの場合、アプリケーションコードは sigleton モードを使用することが推奨
  5. String topicName = "TestTopic";
  6. TopicMeta meta = new TopicMeta();
  7. meta.setTopicName(topicName);
  8. try {
  9. CloudTopic topic = client.createTopic(meta);
  10. } catch (Exception e)
  11. e.printStackTrace();
  12. System.out.println("create topic error, " + e.getMessage());
  13. }
  14. client.close();
  15. }
  16. }

3. HttpEndpoint の開始

サンプルコードファイル HttpEndpoint.java は、以下の機能を含むローカル HTTP メッセージ受信機があるフォルダ aliyun-sdk-mns-samples の下にあります。

  1. MNS からのプッシュリクエストの署名を検証
  2. リクエストをプッシュするために本文を解析
  3. プッシュリクエストの戻りコード 200 に応答

HttpEndpoint でのソースコードの実装については、SDK のソースコードを参照してください。Java SDK の src/main/java/com/aliyun/mns/sample フォルダにサンプルコードファイル “HttpEndpoint.java” があります。

4. 購読の作成

エンドポイント、再試行ポリシー、メッセージフォーマットは購読の作成時に設定する必要があります。

  1. public class SubscribeDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient();
  5. CloudTopic topic = client.getTopicRef("TestTopic");
  6. try {
  7. SubscriptionMeta subMeta = new SubscriptionMeta();
  8. subMeta.setSubscriptionName("TestSub");
  9. subMeta.setEndpoint(HttpEndpoint.GenEndpointLocal());
  10. subMeta.setNotifyContentFormat(SubscriptionMeta.NotifyContentFormat.XML);
  11. //subMeta.setFilterTag("filterTag"); //Set filterTag for subscription
  12. String subUrl = topic.subscribe(subMeta);
  13. System.out.println("subscription url: " + subUrl);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. System.out.println("subscribe/unsubribe error");
  17. }
  18. client.close();
  19. }
  20. }

5. メッセージのパブリッシュ

トピックと購読を作成後、メッセージをトピックにパブリッシュします。

  1. public class PublishMessageDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient();
  5. CloudTopic topic = client.getTopicRef("TestTopic");
  6. try {
  7. TopicMessage msg = new Base64TopicMessage();
  8. msg.setMessageBody("hello world!");
  9. //msg.setMessageTag("filterTag"); //Set filterTag filterTag
  10. msg = topic.publishMessage(msg);
  11. System.out.println(msg.getMessageId());
  12. System.out.println(msg.getMessageBodyMD5());
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. System.out.println("subscribe error");
  16. }
  17. client.close();
  18. }
  19. }

6. HttpEndpoint 内のメッセージの確認

MNS は、ステップ 5 で公開されたメッセージをエンドポイントにプッシュします。

7. サブスクリプションのキャンセル

トピックからメッセージを受信したくない場合は、購読をキャンセルします。

  1. public class UnsubscribeDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient();
  5. CloudTopic topic = client.getTopicRef("TestTopic");
  6. try {
  7. topic.unsubscribe("TestSub");
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. System.out.println("unsubribe error");
  11. }
  12. client.close();
  13. }
  14. }

8. トピックの削除

  1. public class DeleteTopicDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient();
  5. CloudTopic topic = client.getTopicRef("TestTopic");
  6. try {
  7. topic.delete();
  8. } catch (Exception e) {
  9. e.printStackTrace();
  10. System.out.println("delete topic error");
  11. }
  12. client.close();
  13. }
  14. }

9. FilterTag(An End2End Case) の使用例

  1. package com.aliyun.mns.samples;
  2. import com.aliyun.mns.client.CloudAccount;
  3. import com.aliyun.mns.client.CloudQueue;
  4. import com.aliyun.mns.client.CloudTopic;
  5. import com.aliyun.mns.client.MNSClient;
  6. import com.aliyun.mns.common.utils.ServiceSettings;
  7. import com.aliyun.mns.model.*;
  8. public class TopicSample {
  9. public static void main(String[] args) {
  10. CloudAccount account = new CloudAccount(
  11. ServiceSettings.getMNSAccessKeyId(),
  12. ServiceSettings.getMNSAccessKeySecret(),
  13. ServiceSettings.getMNSAccountEndpoint());
  14. MNSClient client = account.getMNSClient();
  15. // step 1 : キューの作成
  16. QueueMeta queueMeta = new QueueMeta();
  17. queueMeta.setQueueName("TestSubForQueue");
  18. CloudQueue queue = client.createQueue(queueMeta);
  19. // step 2 : トピックの作成
  20. TopicMeta topicMeta = new TopicMeta();
  21. topicMeta.setTopicName("TestTopic");
  22. CloudTopic topic = client.createTopic(topicMeta);
  23. // step 3 : 購読の作成
  24. SubscriptionMeta subMeta = new SubscriptionMeta();
  25. subMeta.setSubscriptionName("TestForQueueSub");
  26. subMeta.setNotifyContentFormat(SubscriptionMeta.NotifyContentFormat.SIMPLIFIED);
  27. subMeta.setEndpoint(topic.generateQueueEndpoint("TestSubForQueue"));
  28. subMeta.setFilterTag("filterTag");
  29. topic.subscribe(subMeta);
  30. // step 4 : メッセージをパブリッシュ
  31. TopicMessage msg = new Base64TopicMessage();
  32. msg.setMessageBody("hello world");
  33. msg.setMessageTag("filterTag");
  34. msg = topic.publishMessage(msg);
  35. // step 5 : キューからメッセージを取得
  36. Message msgReceive = queue.popMessage(30);
  37. System.out.println("ReceiveMessage From TestSubForQueue:");
  38. System.out.println(msgReceive.getMessageBody());
  39. System.exit(0);
  40. }
  41. }