本文介绍如何使用Java SDK中的sample代码,完成创建主题、创建订阅、发布消息以及接收消息等操作。
步骤一:准备工作
- 下载最新版Java SDK,解压到aliyun-sdk-mns-samples文件夹。
- 用Eclipse导入Maven工程,选中aliyun-sdk-mns-samples文件夹。
- 在用户目录中创建.aliyun-mns.properties文件,并填写服务地址、AccessKey ID和AccessKey Secret。
说明 Linux系统用户目录为/home/YOURNAME/,Windows系统用户目录为C:\Users\YOURNAME。
- AccessKeyId、AccessKeySecret
- 访问阿里云API的密钥对。
- 如果使用阿里云账号访问,登录AccessKey管理页面创建、查看。
- 如果使用RAM用户访问,登录阿里云访问控制控制台查看。
- Endpoint
- 访问消息服务MNS的接入地址,登录MNS控制台,单击右上角获取Endpoint查看。
- 不同地域的接入地址不同,分为公网以及私网域名。
- AccessKeyId、AccessKeySecret
步骤二:创建主题
创建主题的代码示例如下。更多信息,请参见Topic。
public class CreateTopicDemo {
public static void main(String[] args) {
CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全。
String topicName = "TestTopic";
TopicMeta meta = new TopicMeta();
meta.setTopicName(topicName);
try {
CloudTopic topic = client.createTopic(meta);
} catch (Exception e) {
e.printStackTrace();
System.out.println("create topic error, " + e.getMessage());
}
client.close();
}
}
步骤三:启动HTTP Endpoint
aliyun-sdk-mns-samples文件夹中有一个HttpEndpoint.java类,简单实现了一个本地启动的HTTP消息接收端,主要功能包括:
- 对消息服务MNS推送消息请求做签名验证。
- 解析推送请求的消息体。
- 返回相应的处理返回码:200。
HTTP Endpoint的具体实现源码可参见SDK中源码。
步骤四:创建订阅
对已创建的主题进行订阅,在订阅时需要设置对应的推送Endpoint地址(目前支持HTTP、邮件、队列、移动推送以及短信)、错误重试策略、推送消息格式等。
public class SubscribeDemo {
public static void main(String[] args) {
CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全。
CloudTopic topic = client.getTopicRef("TestTopic");
try {
SubscriptionMeta subMeta = new SubscriptionMeta();
subMeta.setSubscriptionName("TestSub");
subMeta.setEndpoint(HttpEndpoint.GenEndpointLocal());
subMeta.setNotifyContentFormat(SubscriptionMeta.NotifyContentFormat.XML);
//subMeta.setFilterTag("filterTag"); //设置订阅的filterTag。
String subUrl = topic.subscribe(subMeta);
System.out.println("subscription url: " + subUrl);
} catch (Exception e) {
e.printStackTrace();
System.out.println("subscribe/unsubribe error");
}
client.close();
}
}
步骤五:发布消息
完成创建主题和订阅,并且启动HTTP Endpoint后,即可向主题发布消息。
public class PublishMessageDemo {
public static void main(String[] args) {
CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全。
CloudTopic topic = client.getTopicRef("TestTopic");
try {
TopicMessage msg = new Base64TopicMessage(); //可以使用TopicMessage结构,选择不进行Base64加密。
msg.setMessageBody("hello world!");
//msg.setMessageTag("filterTag"); //设置该条发布消息的filterTag。
msg = topic.publishMessage(msg);
System.out.println(msg.getMessageId());
System.out.println(msg.getMessageBodyMD5());
} catch (Exception e) {
e.printStackTrace();
System.out.println("subscribe error");
}
client.close();
}
}
步骤六:查看HTTP Endpoint接收消息
- 消息服务MNS将步骤五中的消息推送到所有的订阅Endpoint。
- HTTP Endpoint将接收到的消息打印出来。
步骤七:取消订阅
如果不需要订阅主题的消息,则可以选择取消订阅。
public class UnsubscribeDemo {
public static void main(String[] args) {
CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全。
CloudTopic topic = client.getTopicRef("TestTopic");
try {
topic.unsubscribe("TestSub");
} catch (Exception e) {
e.printStackTrace();
System.out.println("unsubribe error");
}
client.close();
}
}
步骤八:删除主题
删除测试用的主题。
public class DeleteTopicDemo {
public static void main(String[] args) {
CloudAccount account = new CloudAccount("YourAccessId", "YourAccessKey", "MNSEndpoint");
MNSClient client = account.getMNSClient(); // 在程序中,CloudAccount以及MNSClient单例实现即可,多线程安全。
CloudTopic topic = client.getTopicRef("TestTopic");
try {
topic.delete();
} catch (Exception e) {
e.printStackTrace();
System.out.println("delete topic error");
}
client.close();
}
}
FilterTag使用示例
示例代码如下所示。
package com.aliyun.mns.samples;
import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudQueue;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.utils.ServiceSettings;
import com.aliyun.mns.model.*;
public class TopicSample {
public static void main(String[] args) {
CloudAccount account = new CloudAccount(
ServiceSettings.getMNSAccessKeyId(),
ServiceSettings.getMNSAccessKeySecret(),
ServiceSettings.getMNSAccountEndpoint());
MNSClient client = account.getMNSClient();
// 1.创建队列。
QueueMeta queueMeta = new QueueMeta();
queueMeta.setQueueName("TestSubForQueue");
CloudQueue queue = client.createQueue(queueMeta);
// 2.创建主题。
TopicMeta topicMeta = new TopicMeta();
topicMeta.setTopicName("TestTopic");
CloudTopic topic = client.createTopic(topicMeta);
// 3.创建订阅。
SubscriptionMeta subMeta = new SubscriptionMeta();
subMeta.setSubscriptionName("TestForQueueSub");
subMeta.setNotifyContentFormat(SubscriptionMeta.NotifyContentFormat.SIMPLIFIED);
subMeta.setEndpoint(topic.generateQueueEndpoint("TestSubForQueue"));
subMeta.setFilterTag("filterTag");
topic.subscribe(subMeta);
// 4.发布消息。
TopicMessage msg = new Base64TopicMessage();
msg.setMessageBody("hello world");
msg.setMessageTag("filterTag");
msg = topic.publishMessage(msg);
// 5.从订阅的队列中获取消息。
Message msgReceive = queue.popMessage(30);
System.out.println("ReceiveMessage From TestSubForQueue:");
System.out.println(msgReceive.getMessageBody());
System.exit(0);
}
}