全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息服务

主题使用手册

更新时间:2017-06-07 13:26:11   分享:   

本文档介绍如何使用java sdk中的sample代码,完成创建主题、创建订阅,发布消息、接收消息以及删除主题等操作。

1. 准备

  • 下载最新版java sdk,解压到aliyun-sdk-mns-samples文件夹;
  • 用Eclipse导入Maven工程,选中aliyun-sdk-mns-samples文件夹;
  • 在用户目录(Linux系统为”/home/YOURNAME/“目录或者Windows系统为 “C:\Users\YOURNAME”目录)中创建.aliyun-mns.properties文件,并填写服务地址、AccessKeyID和AccessKeySecret:
    • AccessKeyId、AccessKeySecret
    • Endpoint
      • 访问MNS的接入地址,登陆MNS控制台 单击右上角 获取Endpoint 查看;
      • 不同地域的接入地址不同,分为公网以及内网域名;

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单例实现即可,多线程安全
  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

aliyun-sdk-mns-samples中有一个HttpEndpoint.java类,简单实现了一个本地启动的Http消息接收端,主要功能包括:

  1. MNS推送消息请求做签名验证;
  2. 解析推送请求的消息body体;
  3. 返回相应的处理返回码:200

HttpEndpoint的具体实现源码可参考sdk中源码;

4. 创建订阅

对已经创建好的主题Topic进行订阅,在订阅时需要设置对应的推送Endpoint地址(目前支持HTTP、邮件以及队列)、错误重试策略、推送消息格式等;

  1. public class SubscribeDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全
  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"); //设置订阅的filterTag
  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.发布消息

在创建好主题以及订阅之后,并且已经启动了HttpEndpoint,我们可以向Topic发布消息。

  1. public class PublishMessageDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全
  5. CloudTopic topic = client.getTopicRef("TestTopic");
  6. try {
  7. TopicMessage msg = new Base64TopicMessage(); //可以使用TopicMessage结构,选择不进行Base64加密
  8. msg.setMessageBody("hello world!");
  9. //msg.setMessageTag("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接收消息

第5步发布了一条消息到Topic中,MNS会将该消息推送到所有的订阅Endpoint,本例中的HttpEndpoint会将接收到的消息打印出来。

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(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全
  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.删除主题

最后选择将Topic删除。

  1. public class DeleteTopicDemo {
  2. public static void main(String[] args) {
  3. CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
  4. MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全
  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使用示例

  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. }
本文导读目录
本文导读目录
以上内容是否对您有帮助?